XooCode(){

CourseInstance

CourseInstance is an Event subtype representing a specific scheduled offering of a Course. A Course is the abstract curriculum ("Introduction to Structured Data"). A CourseInstance is when and where that curriculum is delivered ("Fall 2026, Tuesdays and Thursdays at 2 PM, blended format"). CourseInstance has 4 properties of its own: courseMode, courseSchedule, courseWorkload, and instructor.

The type hierarchy is Thing → Event → CourseInstance. The Course links to its instances via hasCourseInstance. Each CourseInstance inherits all Event properties (startDate, endDate, location, offers, maximumAttendeeCapacity) and adds delivery-specific details that vary between offerings of the same course.

Full example of schema.org/CourseInstance json-ld markup

The markup is verified as valid with Rich Results Test from Google.

Highlight legend:Required by GoogleRecommendedOptional
schema.org/CourseInstance
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@id": "https://roymed.dk/courses/ped-412/fall-2026#instance",
  "@type": "CourseInstance",
  "name": "PED-412: Historical Perspectives in Pediatric Medicine, Fall 2026",
  "url": "https://roymed.dk/courses/ped-412/fall-2026",
  "description": "Fall 2026 offering of PED-412. Blended format: on-campus lectures Tuesdays and Thursdays with online case study modules. Covers post-war pediatric frameworks, triage protocols, and nutritional rehabilitation.",
  "image": "https://roymed.dk/courses/ped-412/fall-2026/banner-16x9.jpg",
  "courseMode": "Blended",
  "courseWorkload": "3 hours of lectures and 5 hours of independent study per week for 12 weeks",
  "startDate": "2026-09-07",
  "endDate": "2026-11-30",
  "eventStatus": "https://schema.org/EventScheduled",
  "eventAttendanceMode": "https://schema.org/MixedEventAttendanceMode",
  "location": {
    "@type": "Place",
    "name": "Royal Institute of Medicine, Room 307",
    "address": {
      "@type": "PostalAddress",
      "streetAddress": "Blegdamsvej 9",
      "addressLocality": "Copenhagen",
      "addressCountry": "DK"
    }
  },
  "instructor": {
    "@type": "Person",
    "name": "Prof. Ana Jensen, MD PhD",
    "jobTitle": "Associate Professor of Pediatric Medicine",
    "url": "https://roymed.dk/staff/ana-jensen",
    "worksFor": {
      "@id": "https://roymed.dk#organization"
    }
  },
  "courseSchedule": {
    "@type": "Schedule",
    "repeatFrequency": "P1W",
    "byDay": [
      "https://schema.org/Tuesday",
      "https://schema.org/Thursday"
    ],
    "startTime": "14:00",
    "endTime": "15:30"
  },
  "organizer": {
    "@id": "https://roymed.dk#organization",
    "@type": "EducationalOrganization",
    "name": "Royal Institute of Medicine"
  },
  "offers": {
    "@type": "Offer",
    "price": "18500",
    "priceCurrency": "DKK",
    "availability": "https://schema.org/InStock",
    "url": "https://roymed.dk/courses/ped-412/fall-2026/enroll"
  },
  "maximumAttendeeCapacity": 24,
  "inLanguage": "en",
  "isAccessibleForFree": false
}
</script>

courseMode

courseMode describes the delivery format: "online", "onsite", "blended", "synchronous", "asynchronous", "full-time", "part-time". It takes text or a URL referencing a controlled vocabulary. Google reads this for education-filtered searches. Use terms that match how students search: "online" is more findable than "distance learning" or "web-mediated."

courseSchedule

courseSchedule takes a Schedule object that describes the recurring meeting pattern. Use repeatFrequency for the recurrence interval ("P1W" for weekly), byDay for the days of the week (as schema.org DayOfWeek URLs), and startTime/endTime for the class hours. This is how you express "Tuesdays and Thursdays, 2:00-3:30 PM" in machine-readable form.

courseWorkload

courseWorkload describes the expected student effort. It takes a text string: "2 hours of lectures, 1 hour of lab work and 3 hours of independent study per week." You can also use an ISO 8601 duration for the total: "P8W" for an 8-week intensive. This helps prospective students gauge the time commitment before enrolling.

instructor

instructor takes a Person object for the teacher or teaching assistant. This is the property that EducationEvent is missing: EducationEvent must use performer for the instructor, but CourseInstance has a dedicated instructor property. Include name, jobTitle, and worksFor so Google can connect the instructor to their academic profile.

CourseInstance vs EducationEvent

CourseInstance is a specific delivery of a Course (tied to a curriculum via hasCourseInstance on the Course). EducationEvent is a standalone educational event not tied to a curriculum. A semester offering of "PED-412" is a CourseInstance. A one-off Saturday workshop is an EducationEvent. The distinction matters because CourseInstance carries courseMode, instructor, and courseWorkload that EducationEvent does not have.

Minimal valid version

The smallest markup that still produces a valid CourseInstance entity. Use it as the floor. Reach for the advanced example above when you want search engines and AI agents to understand more about your content.

schema.org/CourseInstance (minimal)
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "CourseInstance",
  "name": "PED-412: Historical Perspectives in Pediatric Medicine, Fall 2026",
  "courseMode": "Blended",
  "startDate": "2026-09-07",
  "endDate": "2026-11-30",
  "eventStatus": "https://schema.org/EventScheduled",
  "eventAttendanceMode": "https://schema.org/MixedEventAttendanceMode",
  "location": {
    "@type": "Place",
    "name": "Royal Institute of Medicine, Room 307",
    "address": { "@type": "PostalAddress", "streetAddress": "Blegdamsvej 9", "addressLocality": "Copenhagen", "addressCountry": "DK" }
  },
  "instructor": { "@type": "Person", "name": "Prof. Ana Jensen, MD PhD" },
  "image": "https://roymed.dk/courses/ped-412/fall-2026/banner-16x9.jpg",
  "description": "Fall 2026 offering of PED-412. Blended format with on-campus lectures and online modules."
}
</script>

Google rich results this unlocks

Markup matching this example makes your page eligible for the following Google Search rich results. The primary target drives the required / recommended property classification in the advanced code block above.

Common CourseInstance mistakes

Mistakes that pass validation but silently fail to earn rich results or mislead consumers walking the graph. Avoid these and your markup will be ahead of most sites in the wild.

  1. 01

    Using Course when you mean CourseInstance

    Wrong
    "@type": "Course" with startDate and instructor for a specific semester
    Right
    "@type": "CourseInstance" for the specific offering; Course for the abstract curriculum

    Course is the curriculum (what is taught, prerequisites, credits). CourseInstance is when and how it is delivered (dates, location, instructor, format). A university course catalog entry is a Course. The Fall 2026 section of that course is a CourseInstance. The Course links to its instances via hasCourseInstance.

  2. 02

    courseMode as a full sentence

    Wrong
    "courseMode": "This course is delivered in a blended format combining in-person and online elements"
    Right
    "courseMode": "Blended"

    courseMode should be a short label: "online", "onsite", "blended", "synchronous", "asynchronous". Search engines parse these as classification tokens, not prose. Use terms that match how students filter course searches.

  3. 03

    Missing courseSchedule on a recurring class

    Wrong
    CourseInstance with startDate and endDate but no courseSchedule
    Right
    "courseSchedule": { "@type": "Schedule", "repeatFrequency": "P1W", "byDay": ["https://schema.org/Tuesday"], "startTime": "14:00", "endTime": "15:30" }

    startDate and endDate define the semester boundaries. courseSchedule defines the recurring meeting pattern within those dates. Without it, students know the course runs September to November but not which days or times.

  4. 04

    Using performer instead of instructor

    Wrong
    "performer": { "@type": "Person", "name": "Prof. Ana Jensen" }
    Right
    "instructor": { "@type": "Person", "name": "Prof. Ana Jensen" }

    CourseInstance has a dedicated instructor property. Unlike EducationEvent (which must use performer as a workaround), CourseInstance should use instructor. This is semantically correct and lets Google connect the person to their academic profile specifically as a teacher.

About the example data

The Fall 2026 offering of PED-412 at the Royal Institute of Medicine in Copenhagen, the same Course where students study Jane Xoo's 1945 paper. This is the standalone CourseInstance entity that the Course example references via hasCourseInstance.

Comments

Loading comments...

Leave a comment