generated: '2026-10-09' method: derived generator: derive-data-model.py source: - openapi/open-education-api-openapi.yml - openapi/open-education-api-v5-openapi.yml notation: has_one = property $ref; has_many = array of $ref; belongs_to = _id field summary: entities: 92 entities_in_spec: 92 relationships: 253 entities: - name: AcademicSession fields: 16 description: A named period of time that can be used to communicate the various schedules and time periods an institution recognizes and uses to organise their education. AcademicSessions can be nested. - name: Address fields: 9 description: The full street address - name: Association fields: 0 - name: AssociationFull fields: 2 - name: AssociationId fields: 1 - name: AssociationProperties fields: 8 description: A relationship between a person object and an offering - name: AssociationWrite fields: 1 - name: Building fields: 9 description: An object describing a building and the properties of a building. - name: Component fields: 19 description: A component is a part of a course - name: ComponentOffering fields: 0 - name: ComponentOfferingAssociation fields: 0 - name: ComponentOfferingAssociationExpandable fields: 0 - name: ComponentResult fields: 0 - name: Consumer fields: 2 description: The additional elements of a consumer that may be provided, see the [documentation on support for specific consumers](https://oeapi.eu/v6.0/#/technical/consumers-and-profiles/) for further information - name: Cost fields: 7 - name: Country fields: 4 description: An object indicating a country based on at least one iso-3166 code. In situations where more than one ISO-3166 code is provided, the codes must refer to the same country. - name: Course fields: 0 - name: CourseExpanded fields: 0 - name: CourseId fields: 1 description: An object describing the metadata of a course - name: CourseOffering fields: 0 - name: CourseOfferingAssociation fields: 0 - name: CourseOfferingAssociationExpandable fields: 0 - name: CourseOfferingAssociationExternalMe fields: 0 - name: CourseOfferingAssociationResult fields: 0 - name: CourseOfferingId fields: 1 - name: CourseProperties fields: 32 description: An object describing the metadata of a course - name: CourseResult fields: 0 - name: Document fields: 3 - name: EducationSpecification fields: 0 - name: EducationSpecificationExpanded fields: 0 - name: EducationSpecificationId fields: 1 - name: EducationSpecificationProperties fields: 19 description: The specification of an education object. This specification allows for other education objects to be derived from it. - name: EnrolmentPeriods fields: 11 description: An enrolment period describes the moment at which an offering is available for enrolment. - name: Ext fields: 0 description: Object for additional non-standard attributes - name: Group fields: 0 - name: GroupId fields: 1 - name: IdentifierEntry fields: 2 - name: LanguageTypedString fields: 2 description: A String with an associated language code. IF this object is used both fields are mandatory. - name: LearningComponent fields: 26 description: A component is a part of a course - name: LearningComponentOffering fields: 0 - name: LearningComponentOfferingAssociation fields: 0 - name: LearningComponentOfferingAssociationResult fields: 0 - name: LearningComponentOfferingId fields: 1 - name: LearningOutcome fields: 16 description: statements regarding what a learner knows, understands and is able to do on completion of a learning process, which are defined in terms of knowledge, skills and responsibility and autonomy (https://e - name: Membership fields: 8 description: A membership contains the information on a membership of a person for a specific group - name: Nationality fields: 3 description: An object indicating nationality based on at least one iso-3166 code. In situations where more than one iso-3166 code is provided the codes have address the same country. - name: NewsFeed fields: 6 description: A placeholder or collection of news items - name: NewsItem fields: 13 description: A newsitem contains the message and metadata of that message - name: Offering fields: 0 - name: OfferingId fields: 1 description: ID of Either a program, course or component offering which descrbes the program, course or offering in time - name: OfferingProperties fields: 23 - name: Organisation fields: 18 description: A description of a group of people working together to achieve a goal - name: Organization fields: 14 description: A description of a group of people working together to achieve a goal - name: Pagination fields: 5 - name: Person fields: 0 - name: PersonId fields: 1 - name: PersonProperties fields: 35 description: A person that has a relationship with this institution - name: PostResponse fields: 2 description: A system message as a response to a POST message - name: Problem fields: 5 description: A problem details object, conforming to RFC 7807 (Problem Details for HTTP - name: ProblemVersionNotAcceptable fields: 0 - name: Program fields: 0 - name: ProgramExpanded fields: 0 - name: ProgramId fields: 1 description: A collection of courses that lead to a certifiable learning outcome - name: ProgramOffering fields: 0 - name: ProgramOfferingAssociation fields: 0 - name: ProgramOfferingAssociationExpandable fields: 0 - name: ProgramProperties fields: 32 description: A collection of courses that lead to a certifiable learning outcome - name: ProgramResult fields: 0 - name: Programme fields: 0 - name: ProgrammeExpanded fields: 0 - name: ProgrammeId fields: 1 description: A collection of courses that lead to a certifiable learning outcome - name: ProgrammeOffering fields: 0 - name: ProgrammeOfferingAssociation fields: 0 - name: ProgrammeOfferingAssociationExternalMe fields: 0 - name: ProgrammeOfferingAssociationResult fields: 0 - name: ProgrammeOfferingId fields: 1 - name: ProgrammeProperties fields: 40 description: A collection of courses that lead to a certifiable learning outcome - name: Result fields: 13 description: A result as part of an association or attempt - name: Room fields: 16 description: An area within a building where education can take place - name: Service fields: 7 description: A metadata set providing details on the provider of this OEAPI implementation - name: StudyLoadDescriptor fields: 2 description: The amount of effort to complete this education in the specified unit. - name: TestComponent fields: 31 description: A component is a part of a course - name: TestComponentOffering fields: 0 - name: TestComponentOfferingAssociation fields: 0 - name: TestComponentOfferingAssociationAttempt fields: 15 description: Planning and execution information on an attempt belong to a TestComponentOfferingAssociation. Result on the attempt - name: TestComponentOfferingAssociationAttemptFull fields: 0 - name: TestComponentOfferingAssociationResult fields: 0 - name: TestComponentOfferingId fields: 1 - name: TimelineOverrideCourse fields: 3 description: A timeline override of the course. - name: TimelineOverrideEducationSpecification fields: 3 description: A timeline override of the EducationSpecification. - name: TimelineOverrideProgram fields: 3 description: A time-line override of the program. - name: TimelineOverrideProgramme fields: 3 description: A time-line override of the programme. relationships: - from: Service to: Ext type: has_one via: ext - from: AcademicSession to: IdentifierEntry type: has_one via: primaryCode - from: AcademicSession to: LanguageTypedString type: has_many via: name - from: AcademicSession to: Consumer type: has_one via: consumer - from: AcademicSession to: Ext type: has_one via: ext - from: Building to: IdentifierEntry type: has_one via: primaryCode - from: Building to: LanguageTypedString type: has_many via: name - from: Building to: Address type: has_one via: address - from: Building to: Consumer type: has_one via: consumer - from: Building to: Ext type: has_one via: ext - from: LearningComponent to: Component type: belongs_to via: componentId - from: LearningComponent to: IdentifierEntry type: has_one via: primaryCode - from: LearningComponent to: LanguageTypedString type: has_many via: name - from: LearningComponent to: LearningOutcome type: belongs_to via: learningOutcomeIds - from: LearningComponent to: Course type: belongs_to via: courseId - from: LearningComponent to: Course type: has_one via: course - from: LearningComponent to: Organisation type: belongs_to via: organisationId - from: LearningComponent to: Organisation type: has_one via: organisation - from: LearningComponent to: Consumer type: has_one via: consumer - from: LearningComponent to: Ext type: has_one via: ext - from: TestComponent to: Component type: belongs_to via: componentId - from: TestComponent to: IdentifierEntry type: has_one via: primaryCode - from: TestComponent to: LanguageTypedString type: has_many via: name - from: TestComponent to: LearningOutcome type: belongs_to via: learningOutcomeIds - from: TestComponent to: Course type: belongs_to via: courseId - from: TestComponent to: Course type: has_one via: course - from: TestComponent to: Organisation type: belongs_to via: organisationId - from: TestComponent to: Organisation type: has_one via: organisation - from: TestComponent to: Consumer type: has_one via: consumer - from: TestComponent to: Ext type: has_one via: ext - from: LearningComponentOffering to: Room type: belongs_to via: roomIds - from: LearningComponentOffering to: LearningComponent type: belongs_to via: learningComponentId - from: LearningComponentOffering to: LearningComponent type: has_one via: learningComponent - from: LearningComponentOffering to: CourseOffering type: belongs_to via: courseOfferingIds - from: LearningComponentOffering to: Organisation type: belongs_to via: organisationId - from: LearningComponentOffering to: Organisation type: has_one via: organisation - from: LearningComponentOfferingAssociation to: LearningComponentOfferingAssociationResult type: has_one via: result - from: LearningComponentOfferingAssociation to: Person type: belongs_to via: personId - from: LearningComponentOfferingAssociation to: Person type: has_one via: person - from: LearningComponentOfferingAssociation to: LearningComponentOffering type: belongs_to via: learningComponentOfferingId - from: LearningComponentOfferingAssociation to: LearningComponentOffering type: has_one via: learningComponentOffering - from: TestComponentOffering to: Room type: belongs_to via: roomIds - from: TestComponentOffering to: Component type: belongs_to via: componentId - from: TestComponentOffering to: TestComponent type: has_one via: component - from: TestComponentOffering to: CourseOffering type: belongs_to via: courseOfferingIds - from: TestComponentOffering to: Organisation type: belongs_to via: organisationId - from: TestComponentOffering to: Organisation type: has_one via: organisation - from: TestComponentOfferingAssociation to: TestComponentOfferingAssociationResult type: has_one via: result - from: TestComponentOfferingAssociation to: Person type: belongs_to via: personId - from: TestComponentOfferingAssociation to: Person type: has_one via: person - from: TestComponentOfferingAssociation to: TestComponentOffering type: belongs_to via: testComponentOfferingId - from: TestComponentOfferingAssociation to: TestComponentOffering type: has_one via: testComponentOffering - from: CourseOffering to: Course type: belongs_to via: courseId - from: CourseOffering to: Course type: has_one via: course - from: CourseOffering to: ProgrammeOffering type: belongs_to via: programmeOfferingIds - from: CourseOffering to: Organisation type: belongs_to via: organisationId - from: CourseOffering to: Organisation type: has_one via: organisation - from: CourseOfferingAssociation to: StudyLoadDescriptor type: has_one via: studyLoad - from: CourseOfferingAssociation to: CourseOfferingAssociationResult type: has_one via: result - from: CourseOfferingAssociation to: CourseOffering type: belongs_to via: courseOfferingId - from: CourseOfferingAssociation to: CourseOffering type: has_one via: courseOffering - from: CourseOfferingAssociation to: Person type: belongs_to via: personId - from: CourseOfferingAssociation to: Person type: has_one via: person - from: Group to: IdentifierEntry type: has_one via: primaryCode - from: Group to: LanguageTypedString type: has_many via: name - from: Group to: Consumer type: has_one via: consumer - from: Group to: Organisation type: belongs_to via: organisationId - from: Group to: Organisation type: has_one via: organisation - from: Group to: AcademicSession type: belongs_to via: academicSessionId - from: Group to: AcademicSession type: has_one via: academicSession - from: Group to: Offering type: belongs_to via: offeringIds - from: Group to: Ext type: has_one via: ext - from: Membership to: Person type: belongs_to via: personId - from: Membership to: Group type: belongs_to via: groupId - from: Membership to: Consumer type: has_one via: consumer - from: Membership to: Ext type: has_one via: ext - from: LearningOutcome to: IdentifierEntry type: has_one via: primaryCode - from: LearningOutcome to: LanguageTypedString type: has_many via: name - from: LearningOutcome to: Consumer type: has_one via: consumer - from: LearningOutcome to: Ext type: has_one via: ext - from: Organisation to: IdentifierEntry type: has_one via: primaryCode - from: Organisation to: LanguageTypedString type: has_many via: name - from: Organisation to: Consumer type: has_one via: consumer - from: Organisation to: Ext type: has_one via: ext - from: ProgrammeOffering to: Programme type: belongs_to via: programmeId - from: ProgrammeOffering to: Programme type: has_one via: programme - from: ProgrammeOffering to: Organisation type: belongs_to via: organisationId - from: ProgrammeOffering to: Organisation type: has_one via: organisation - from: Room to: IdentifierEntry type: has_one via: primaryCode - from: Room to: LanguageTypedString type: has_many via: name - from: Room to: Building type: belongs_to via: buildingId - from: Room to: Building type: has_one via: building - from: Room to: Consumer type: has_one via: consumer - from: Room to: Ext type: has_one via: ext - from: ProgrammeOfferingAssociation to: Person type: belongs_to via: personId - from: ProgrammeOfferingAssociation to: Person type: has_one via: person - from: ProgrammeOfferingAssociation to: ProgrammeOffering type: belongs_to via: programmeOfferingId - from: ProgrammeOfferingAssociation to: ProgrammeOffering type: has_one via: programmeOffering - from: TestComponentOfferingAssociationAttempt to: Room type: belongs_to via: roomIds - from: TestComponentOfferingAssociationAttempt to: Person type: has_one via: coordinator - from: TestComponentOfferingAssociationAttempt to: Result type: has_one via: result - from: TestComponentOfferingAssociationAttempt to: Consumer type: has_one via: consumer - from: ProblemVersionNotAcceptable to: Consumer type: has_one via: consumer - from: CourseOfferingId to: CourseOffering type: belongs_to via: courseOfferingId - from: EnrolmentPeriods to: Consumer type: has_one via: consumer - from: EnrolmentPeriods to: Ext type: has_one via: ext - from: OfferingProperties to: IdentifierEntry type: has_one via: primaryCode - from: OfferingProperties to: Group type: belongs_to via: groupIds - from: OfferingProperties to: AcademicSession type: belongs_to via: academicSessionId - from: OfferingProperties to: AcademicSession type: has_one via: academicSession - from: OfferingProperties to: LanguageTypedString type: has_many via: name - from: OfferingProperties to: Consumer type: has_one via: consumer - from: OfferingProperties to: Ext type: has_one via: ext - from: Address to: Country type: has_one via: countryCode - from: Address to: Ext type: has_one via: ext - from: Cost to: Ext type: has_one via: ext - from: CourseId to: Course type: belongs_to via: courseId - from: ProgrammeId to: Programme type: belongs_to via: programmeId - from: PersonId to: Person type: belongs_to via: personId - from: PersonProperties to: IdentifierEntry type: has_one via: primaryCode - from: PersonProperties to: Country type: has_one via: countryOfBirth - from: PersonProperties to: Nationality type: has_one via: nationality - from: PersonProperties to: Address type: has_one via: address - from: PersonProperties to: Consumer type: has_one via: consumer - from: PersonProperties to: Ext type: has_one via: ext - from: ProgrammeProperties to: IdentifierEntry type: has_one via: primaryCode - from: ProgrammeProperties to: LanguageTypedString type: has_many via: name - from: ProgrammeProperties to: LearningOutcome type: belongs_to via: learningOutcomeIds - from: ProgrammeProperties to: Programme type: has_one via: parent - from: ProgrammeProperties to: Organisation type: belongs_to via: organisationId - from: ProgrammeProperties to: Organisation type: has_one via: organisation - from: ProgrammeProperties to: Consumer type: has_one via: consumer - from: ProgrammeProperties to: Ext type: has_one via: ext - from: CourseProperties to: IdentifierEntry type: has_one via: primaryCode - from: CourseProperties to: LanguageTypedString type: has_many via: name - from: CourseProperties to: LearningOutcome type: belongs_to via: learningOutcomeIds - from: CourseProperties to: Programme type: belongs_to via: programmeIds - from: CourseProperties to: Organisation type: belongs_to via: organisationId - from: CourseProperties to: Organisation type: has_one via: organisation - from: CourseProperties to: Consumer type: has_one via: consumer - from: CourseProperties to: Ext type: has_one via: ext - from: ProgrammeOfferingId to: ProgrammeOffering type: belongs_to via: programmeOfferingId - from: LearningComponentOfferingId to: LearningComponentOffering type: belongs_to via: learningComponentOfferingId - from: TestComponentOfferingId to: TestComponentOffering type: belongs_to via: testComponentOfferingId - from: AssociationId to: Association type: belongs_to via: associationId - from: AssociationProperties to: Consumer type: has_one via: consumer - from: AssociationProperties to: Ext type: has_one via: ext - from: Result to: Person type: has_one via: assessor - from: Result to: Consumer type: has_one via: consumer - from: Result to: Ext type: has_one via: ext - from: CourseOfferingAssociationResult to: StudyLoadDescriptor type: has_one via: studyLoad - from: CourseOfferingAssociationExternalMe to: StudyLoadDescriptor type: has_one via: studyLoad - from: CourseOfferingAssociationExternalMe to: CourseOfferingAssociationResult type: has_one via: result - from: CourseOfferingAssociationExternalMe to: CourseOffering type: belongs_to via: courseOfferingId - from: CourseOfferingAssociationExternalMe to: CourseOffering type: has_one via: courseOffering - from: PostResponse to: LanguageTypedString type: has_many via: message - from: GroupId to: Group type: belongs_to via: groupId - from: TimelineOverrideCourse to: CourseProperties type: has_one via: course - from: ProgrammeOfferingAssociationResult to: StudyLoadDescriptor type: has_one via: studyLoad - from: ProgrammeOfferingAssociationExternalMe to: ProgrammeOfferingAssociationResult type: has_one via: result - from: ProgrammeOfferingAssociationExternalMe to: ProgrammeOffering type: belongs_to via: programmeOfferingId - from: ProgrammeOfferingAssociationExternalMe to: ProgrammeOffering type: has_one via: programmeOffering - from: TimelineOverrideProgramme to: ProgrammeProperties type: has_one via: programme - from: TestComponentOfferingAssociationAttemptFull to: CourseOfferingAssociation type: belongs_to via: courseOfferingAssociationId - from: TestComponentOfferingAssociationAttemptFull to: TestComponentOfferingAssociation type: belongs_to via: testComponentOfferingAssociationId - from: ProgramResult to: StudyLoadDescriptor type: has_one via: studyLoad - from: ProgramOfferingAssociation to: ProgramResult type: has_one via: result - from: OfferingId to: Offering type: belongs_to via: offeringId - from: ProgramId to: Program type: belongs_to via: programId - from: EducationSpecificationId to: EducationSpecification type: belongs_to via: educationSpecificationId - from: Organization to: IdentifierEntry type: has_one via: primaryCode - from: Organization to: LanguageTypedString type: has_many via: name - from: Organization to: LanguageTypedString type: has_many via: description - from: Organization to: Address type: has_many via: addresses - from: Organization to: IdentifierEntry type: has_many via: otherCodes - from: Organization to: Consumer type: has_many via: consumers - from: Organization to: Ext type: has_one via: ext - from: EducationSpecificationProperties to: IdentifierEntry type: has_one via: primaryCode - from: EducationSpecificationProperties to: IdentifierEntry type: has_many via: otherCodes - from: EducationSpecificationProperties to: LanguageTypedString type: has_many via: name - from: EducationSpecificationProperties to: LanguageTypedString type: has_many via: description - from: EducationSpecificationProperties to: StudyLoadDescriptor type: has_one via: studyLoad - from: EducationSpecificationProperties to: EducationSpecification type: has_one via: parent - from: EducationSpecificationProperties to: EducationSpecification type: has_many via: children - from: EducationSpecificationProperties to: Organization type: has_one via: organization - from: EducationSpecificationProperties to: Consumer type: has_many via: consumers - from: EducationSpecificationProperties to: Ext type: has_one via: ext - from: ProgramProperties to: IdentifierEntry type: has_one via: primaryCode - from: ProgramProperties to: LanguageTypedString type: has_many via: name - from: ProgramProperties to: LanguageTypedString type: has_many via: description - from: ProgramProperties to: StudyLoadDescriptor type: has_one via: studyLoad - from: ProgramProperties to: LanguageTypedString type: has_many via: enrollment - from: ProgramProperties to: LanguageTypedString type: has_many via: assessment - from: ProgramProperties to: LanguageTypedString type: has_many via: admissionRequirements - from: ProgramProperties to: LanguageTypedString type: has_many via: qualificationRequirements - from: ProgramProperties to: EducationSpecification type: has_one via: educationSpecification - from: ProgramProperties to: IdentifierEntry type: has_many via: otherCodes - from: ProgramProperties to: Address type: has_many via: addresses - from: ProgramProperties to: Program type: has_one via: parent - from: ProgramProperties to: Program type: has_many via: children - from: ProgramProperties to: Person type: has_many via: coordinators - from: ProgramProperties to: Organization type: has_one via: organization - from: ProgramProperties to: Consumer type: has_many via: consumers - from: ProgramProperties to: Ext type: has_one via: ext - from: ProgramOffering to: Address type: has_many via: addresses - from: ProgramOffering to: Cost type: has_many via: priceInformation - from: ProgramOffering to: Program type: has_one via: program - from: ProgramOffering to: Organization type: has_one via: organization - from: CourseResult to: StudyLoadDescriptor type: has_one via: studyLoad - from: ComponentOfferingAssociation to: ComponentResult type: has_one via: result - from: Component to: IdentifierEntry type: has_one via: primaryCode - from: Component to: LanguageTypedString type: has_many via: name - from: Component to: LanguageTypedString type: has_many via: description - from: Component to: LanguageTypedString type: has_many via: enrollment - from: Component to: LanguageTypedString type: has_many via: assessment - from: Component to: Address type: has_many via: addresses - from: Component to: IdentifierEntry type: has_many via: otherCodes - from: Component to: Course type: has_one via: course - from: Component to: Organization type: has_one via: organization - from: Component to: Consumer type: has_many via: consumers - from: Component to: Ext type: has_one via: ext - from: ComponentOffering to: Address type: has_many via: addresses - from: ComponentOffering to: Cost type: has_many via: priceInformation - from: ComponentOffering to: Room type: has_one via: room - from: ComponentOffering to: Component type: has_one via: component - from: ComponentOffering to: CourseOffering type: has_one via: courseOffering - from: ComponentOffering to: Organization type: has_one via: organization - from: TimelineOverrideProgram to: ProgramProperties type: has_one via: program - from: ProgramExpanded to: TimelineOverrideProgram type: has_many via: timelineOverrides - from: ProgramOfferingAssociationExpandable to: ProgramResult type: has_one via: result - from: ProgramOfferingAssociationExpandable to: PersonId type: has_one via: person - from: CourseOfferingAssociationExpandable to: CourseResult type: has_one via: result - from: CourseOfferingAssociationExpandable to: PersonId type: has_one via: person - from: ComponentOfferingAssociationExpandable to: ComponentResult type: has_one via: result - from: ComponentOfferingAssociationExpandable to: PersonId type: has_one via: person - from: AssociationFull to: Person type: has_one via: person - from: AssociationFull to: ComponentOffering type: has_one via: offering - from: AssociationFull to: CourseOffering type: has_one via: offering - from: AssociationFull to: ProgramOffering type: has_one via: offering - from: AssociationWrite to: ComponentOffering type: has_one via: offering - from: AssociationWrite to: CourseOffering type: has_one via: offering - from: AssociationWrite to: ProgramOffering type: has_one via: offering - from: NewsFeed to: LanguageTypedString type: has_many via: name - from: NewsFeed to: LanguageTypedString type: has_many via: description - from: NewsFeed to: Consumer type: has_many via: consumers - from: NewsFeed to: Ext type: has_one via: ext - from: NewsItem to: LanguageTypedString type: has_many via: name - from: NewsItem to: LanguageTypedString type: has_many via: content - from: NewsItem to: NewsFeed type: has_many via: newsFeeds - from: NewsItem to: Consumer type: has_many via: consumers - from: NewsItem to: Ext type: has_one via: ext - from: TimelineOverrideEducationSpecification to: EducationSpecificationProperties type: has_one via: educationSpecification - from: EducationSpecificationExpanded to: TimelineOverrideEducationSpecification type: has_many via: timelineOverrides