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.
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
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.
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.
{
"@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.
creator auf ein
Person- oder Organization-Objekt.
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"
}
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"
}
}
Course (hasPart, isPartOf)
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[ |
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": [ "..." ]
}]
LearningItem (hasCourseInstance)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[ |
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": [ "..." ]
}
CourseInstance (subEvent)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[ |
Urheber der Lernressource. |
publisher |
nein | array[ |
Herausgeber der Lernressource. |
Course (isBasedOn, hasPart)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[ |
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[ |
Bildungsstufe des Programms |
educationalAlignment |
nein | array[ |
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[ |
Modulbereiche mit Credits und den jeweils enthaltenen Kursen |
isPartOf |
nein | array[ |
Liste von Programmen, zu denen das Programm gehört |
educationalCredentialAwarded |
nein | array[ |
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"
}]
}
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[ |
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"
}
}]
}
EducationalOccupationalProgram (hasPart)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"
}
}
Course (isPartOf)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[ |
Credentials, die Teil dieses Credentials sind. |
isPartOf |
nein | array[ |
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[ |
Kompetenzen, die für den Erwerb des Credentials erforderlich sind. |
educationalLevel |
nein | array[ |
Bildungsstufe des Credentials. |
educationalAlignment |
nein | array[ |
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[ |
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"
}
}
]
}
Course (educationalCredentialAwarded),
EducationalOccupationalProgram (educationalCredentialAwarded)
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"
}
}
EducationalOccupationalCredential (isPartOf, hasPart)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"
string (URI)Course (id),
CourseInstance (id),
EducationalOccupationalProgram (id),
EducationalOccupationalCredential (id),
Person (id),
Organization (id),
Concept (id)
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."
}
Ein RichText ist eine nichtleere Liste von TextObject-Objekten, die
denselben
Text in verschiedenen Sprachen und Formaten enthalten.
TextObject-Objekt sein.
[
{
"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"
}
]
Course (description, learningOutcomeSummary, coursePrerequisites),
EducationalOccupationalProgram (description, programPrerequisites),
EducationalOccupationalCredential (description)
Person (description),
Organization (description),
Location (description),
Audience (description)
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"
}
Schedule beschreibt regelmäßige oder wiederkehrende Termine.
| Eigenschaft | Pflichtfeld | Typ | Hinweis |
|---|---|---|---|
type |
ja | "Schedule" |
|
byDay |
ja | array[ |
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"
}
CourseInstance (courseSchedule),
CourseEvent (eventSchedule)
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"
}
Course (offers)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[ |
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"
}
}
}
Course (publisher, creator, contributor, funder),
CourseInstance (instructor), CourseEvent (instructor),
EducationalOccupationalProgram (provider),
Location (owner),
LearningItem (publisher, creator)
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[ |
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
}
}
}
Course (publisher, creator, contributor, funder),
EducationalOccupationalProgram (provider),
Location (owner),
LearningItem (publisher, creator),
Person (affiliation)
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[ |
Öffnungszeiten des Ortes |
owner |
nein | |
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[ |
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"
}
CourseInstance (location),
CourseEvent (location)
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"
}
Location (postalAddress)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
}
Location (geo)OpeningHoursSpecification beschreibt die Öffnungszeiten eines Ortes.
| Eigenschaft | Pflichtfeld | Typ | Hinweis |
|---|---|---|---|
type |
ja | "OpeningHoursSpecification" |
|
dayOfWeek |
ja | array[ |
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) |
Location (openingHoursSpecification)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"
}
Course (license),
ImageObject (license),
Trailer (license)
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"
}
}
Course (image),
EducationalOccupationalProgram (image),
Location (photo),
Person (image),
Organization (image)
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"
}
}
Course (trailer)Die folgenden Typen sind Enumerationen, die nur bestimmte Werte zulassen.
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"]
Course (courseMode), EducationalOccupationalProgram
(educationalProgramMode)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"]
Course (accessMode)DayOfWeek ist ein Wochentag Enum-Typ, der in schema.org definiert ist.
Folgende Werte sind zulässig:
https://schema.org/Mondayhttps://schema.org/Tuesdayhttps://schema.org/Wednesdayhttps://schema.org/Thursdayhttps://schema.org/Fridayhttps://schema.org/Saturdayhttps://schema.org/SundayOpeningHoursSpecification (dayOfWeek),
Schedule (byDay),
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)Offer (category)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 ZahlungsfrequenzOffer (paymentFrequency)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."
}
}
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.
ISCED-F AlignmentOEFOS AlignmentHochschulfächersystematik AlignmentSchulfächer AlignmentHolland Codes Alignment
"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"
}
]
Course (educationalAlignment)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"
}
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]].
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"
}
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"
}
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"
}
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/"
}
Competency (proficiencyLevel)
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:
id ist die URI des Skills, zum Beispiel
http://data.europa.eu/esco/skill/...; inScheme ist
http://data.europa.eu/esco/concept-scheme/skills.
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"
}
Competency (relatedSkill)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"
}
}
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/"
}
Course (educationalLevel)
EducationalOccupationalCredential (educationalLevel)
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/administratorhttp://purl.org/dcx/lrmi-vocabs/educationalAudienceRole/generalPublichttp://purl.org/dcx/lrmi-vocabs/educationalAudienceRole/mentorhttp://purl.org/dcx/lrmi-vocabs/educationalAudienceRole/parenthttp://purl.org/dcx/lrmi-vocabs/educationalAudienceRole/peerTutorhttp://purl.org/dcx/lrmi-vocabs/educationalAudienceRole/professionalhttp://purl.org/dcx/lrmi-vocabs/educationalAudienceRole/studenthttp://purl.org/dcx/lrmi-vocabs/educationalAudienceRole/teacherinScheme 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"
}
Audience (audienceType)
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"
}
EducationalOccupationalCredential (credentialCategory)
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/activehttp://purl.org/dcx/lrmi-vocabs/interactivityType/expositivehttp://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/"
}
Course (interactivityType)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 Loginhttp://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/"
}
Course (conditionsOfAccess)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[ |
Skills aus einem bekannten oder provider-eigenen Kompetenzvokabular. |
proficiencyLevel |
nein | array[ |
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"
}
}
]
}
Course (competencyRequired, teaches, assesses)
EducationalOccupationalCredential (competencyRequired)
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[ |
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
}
}
Course (audience)
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
}
Audience (suggestedAge)
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
}
Course (aggregateRating)
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.
self, first,
last sowie optional next und prev.
courses, programs, credentials,
persons, organizations und
locations.
array[CatalogResource]
{
"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`.
Die kanonischen Query-Parameter sind:
page[number]: einbasierte Seitennummer; Standardwert
ist 1.page[size]: angeforderte Seitengröße. Anbieter dürfen
eine dokumentierte Höchstgröße anwenden und müssen die tatsächlich
verwendete Seite über die Links ausweisen.filter[type]: optional, kommaseparierte Liste aus
courses, programs, credentials,
persons, organizations und
locations.
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.
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.