What Is Course Schema? The Complete Guide (2026)

Saar Twito9 min read
Saar Twito
Saar TwitoFounder & SEO Engineer

Hi, I'm Saar - a software engineer, SEO specialist, and lecturer who loves building tools and teaching tech.

View author profile →

What Is Course Schema?

Course schema is a type of structured data — based on the Schema.org Course vocabulary — that tells Google a page describes an educational course. It is used by online learning platforms, universities, bootcamps, and professional training providers to make their courses discoverable in Google Search.

Important: course-info rich results were deprecated in June 2025

In June 2025, Google retired the course-info rich result — the detailed search card that showed start date, price, instructor, and enrollment info. As of September 2025, it was also removed from Search Console reporting and the Rich Results Test. The underlying Course schema vocabulary remains valid and continues to be used by AI search systems and the Course List carousel.

The Course List carousel — a separate, older feature that shows a scrollable list of courses from a single site — is still active and supported. It requires an ItemList wrapper with at least 3 courses.

TL;DR
  • Course schema describes educational courses — now primarily valuable for the Course List carousel, AI search visibility, and voice assistant responses.
  • Two required fields: name (no promotional phrases, no prices) and description (min 20 characters, no promotional content).
  • For the Course List carousel, use ItemList with at least 3 ListItem objects — each needing a sequential position and a unique url.
  • provider is strongly recommended — it needs name and optionally sameAswith the organization's homepage URL.

Two Course Schema Patterns

Greadme validates two Course schema patterns, each with a different structure and purpose:

PatternSchema structureGoogle feature
Individual course pageCourse at root — with provider, hasCourseInstance, offers, etc.No active Google rich result (course-info deprecated June 2025); valuable for AI search and voice assistants
Course listing pageItemList → array of ListItem objects, each containing a Course with a unique urlCourse List carousel — still active; requires at least 3 courses

Required Properties

PropertyTypeDescription
nameTextThe title of the course. Greadme enforces strict content rules — errors for promotional phrases ("Best school in the world", "#1"), prices in the title ($, , currency words), and discount language (%, "off", "sale", "free"). Warnings for generic phrases like "make money" or "secrets". Use descriptive educational titles only.
descriptionTextA description of the course content. Minimum 20 characters — Greadme warns for shorter descriptions. No promotional content, prices, or discount language — Greadme warns if detected. Google recommends 240–500 characters for best results.

Recommended Properties

PropertyTypeNotes
providerOrganizationThe organization publishing the course. Greadme deducts 12 points if missing. The provider object needs name (error if missing) and sameAswith the organization's homepage URL (warning if missing). Valid @type values: Organization, CollegeOrUniversity, EducationalOrganization, Corporation.
urlURLCanonical URL of the course page. Required inside ListItem.item for Course List carousel — must be unique per course.
hasCourseInstanceCourseInstance or arrayA specific scheduled offering of the course. See the CourseInstance section below.
educationalLevelTextThe target audience level. Common values: "Beginner", "Intermediate", "Advanced".
coursePrerequisitesText or CourseSkills or prior knowledge required. Greadme warns if the property is present but the array is empty.
educationalCredentialAwardedText or URLCertificate or credential earned on completion (e.g., "Professional Certificate in Data Science").
inLanguageTextLanguage of instruction using IETF BCP 47 codes (e.g., "en", "es", "fr").

CourseInstance: Scheduled Offerings

CourseInstance — a subtype of Event — represents a specific scheduled offering of a course at a particular time, location, and modality. A single course can have multiple instances (e.g., a January cohort and a March cohort).

PropertyTypeNotes
courseModeTextDelivery format. Accepted values: "online", "onsite", "blended". Greadme warns for any other value.
instructorPersonThe person teaching this instance. Include name.
startDateDateStart date of this specific offering in ISO 8601 format.
endDateDateEnd date of this specific offering.
locationPlace or VirtualLocationWhere the course takes place. Use VirtualLocation with a url for online courses; Place with a PostalAddress for in-person.
offersOfferPricing for this specific instance. The category field accepts exactly four values: "Free", "Partially Free", "Subscription", or "Paid".

Course List Carousel: ItemList Structure

The Course List carousel shows multiple courses from your site as a scrollable card row in Google Search. Requirements:

  • Use ItemList as the root @type
  • At least 3 ListItem objects — Greadme errors if fewer are present
  • Each ListItem needs a sequential position (integer) and a unique item.url
  • Duplicate URLs cause an error in Greadme
{
  "@context": "https://schema.org",
  "@type": "ItemList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position": 1,
      "item": {
        "@type": "Course",
        "url": "https://example.com/courses/python-intro",
        "name": "Introduction to Python Programming",
        "description": "Learn Python from scratch with hands-on projects.",
        "provider": {
          "@type": "Organization",
          "name": "Code Academy Pro",
          "sameAs": "https://example.com"
        }
      }
    },
    {
      "@type": "ListItem",
      "position": 2,
      "item": {
        "@type": "Course",
        "url": "https://example.com/courses/data-science",
        "name": "Data Science with Python",
        "description": "Analyse real datasets using pandas, numpy, and scikit-learn.",
        "provider": {
          "@type": "Organization",
          "name": "Code Academy Pro",
          "sameAs": "https://example.com"
        }
      }
    },
    {
      "@type": "ListItem",
      "position": 3,
      "item": {
        "@type": "Course",
        "url": "https://example.com/courses/machine-learning",
        "name": "Machine Learning Fundamentals",
        "description": "Build and evaluate ML models using Python and scikit-learn.",
        "provider": {
          "@type": "Organization",
          "name": "Code Academy Pro",
          "sameAs": "https://example.com"
        }
      }
    }
  ]
}

Individual Course Page Example

{
  "@context": "https://schema.org",
  "@type": "Course",
  "name": "Advanced React Development",
  "description": "Master React hooks, performance patterns, and testing strategies.",
  "provider": {
    "@type": "Organization",
    "name": "Frontend Masters",
    "sameAs": "https://example.com"
  },
  "educationalLevel": "Advanced",
  "inLanguage": "en",
  "coursePrerequisites": "Basic JavaScript and React knowledge",
  "hasCourseInstance": {
    "@type": "CourseInstance",
    "courseMode": "online",
    "startDate": "2026-07-01",
    "endDate": "2026-08-31",
    "instructor": {
      "@type": "Person",
      "name": "Alex Chen"
    },
    "offers": {
      "@type": "Offer",
      "category": "Paid",
      "price": 199,
      "priceCurrency": "USD"
    }
  }
}

Content Restrictions: What Course Names Cannot Contain

Google's content policy for Course schema is strictly enforced in the name field. The following all cause errors in Greadme:

Violation typeExamples
Promotional phrases"The #1 Python Course", "Best Data Science Program in the World", "The Greatest UX Bootcamp"
Prices in the title"Learn JavaScript — Only $29", "React Course for 50 Dollars"
Discount/offer language"Python Bootcamp — 25% Off", "Free Limited Time Offer", "React Discount Deal"
Generic get-rich titles (warning)"Secrets to Making Money Online", "Life Hacks for Success"

Ineligible content types for Course schema altogether: degree overview pages (not a specific course), standalone exams with no instructional content, brief tutorial videos, and public events unrelated to a structured curriculum.

5 Common Course Schema Mistakes

1. Fewer Than 3 Courses in the ItemList

The Course List carousel requires at least 3 courses. Greadme throws an error for lists with fewer. If you only have 2 courses, use individual Course schema on each page instead of an ItemList — do not pad the list with duplicates.

2. Promotional Language in the Course Name

The namefield must contain only the course title. Terms like "best", "#1", "% off", "free", or prices cause Greadme errors. These are Google policy violations, not style suggestions.

3. Missing provider.name

The provider object without a name property causes an error in Greadme. The provider name is what Google uses to identify the institution in search results — it must be present and accurate.

4. Using an Invalid courseMode

Greadme accepts "online", "onsite", and "blended" for courseMode. Other values trigger a warning. Do not use free-text descriptions like "self-paced" or "live sessions" in this field — those belong in the description.

5. Duplicate URLs in ItemList

Every course in the ItemList carousel must have a unique url. Greadme errors on duplicate URLs. If the same course appears at multiple URLs on your site, canonicalize first, then mark up only the canonical URL.

Course Schema and AI Search Visibility

Despite the deprecation of course-info rich results, Course schema remains highly valuable for AI-driven search. When someone asks "What are the best online Python courses?" in ChatGPT Search, Perplexity, or Google AI Overviews, these systems parse structured data to identify courses, their providers, levels, and pricing. A well-implemented Course schema makes your course a structured, machine-readable entity — significantly more likely to be cited than a page with only prose content.

Voice assistants follow the same pattern: "Hey Google, find me a beginner React course" pulls from structured course data. The educationalLevel, provider.name, and description fields are the most impactful for AI and voice discoverability.

How to Validate Your Course Schema

Paste your course page URL into Greadme to validate your Course schema. Greadme automatically detects whether you're using a single Course or an ItemList carousel and applies the appropriate rules. It checks course name content policy, provider structure, CourseInstance validity, duplicate URL detection in carousels, and the 3-course minimum requirement for the Course List feature.