What Is Course Schema? The Complete Guide (2026)
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.
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.
- 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) anddescription(min 20 characters, no promotional content). - For the Course List carousel, use
ItemListwith at least 3ListItemobjects — each needing a sequentialpositionand a uniqueurl. provideris strongly recommended — it needsnameand optionallysameAswith the organization's homepage URL.
Two Course Schema Patterns
Greadme validates two Course schema patterns, each with a different structure and purpose:
| Pattern | Schema structure | Google feature |
|---|---|---|
| Individual course page | Course 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 page | ItemList → array of ListItem objects, each containing a Course with a unique url | Course List carousel — still active; requires at least 3 courses |
Required Properties
| Property | Type | Description |
|---|---|---|
name | Text | The 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. |
description | Text | A 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
| Property | Type | Notes |
|---|---|---|
provider | Organization | The 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. |
url | URL | Canonical URL of the course page. Required inside ListItem.item for Course List carousel — must be unique per course. |
hasCourseInstance | CourseInstance or array | A specific scheduled offering of the course. See the CourseInstance section below. |
educationalLevel | Text | The target audience level. Common values: "Beginner", "Intermediate", "Advanced". |
coursePrerequisites | Text or Course | Skills or prior knowledge required. Greadme warns if the property is present but the array is empty. |
educationalCredentialAwarded | Text or URL | Certificate or credential earned on completion (e.g., "Professional Certificate in Data Science"). |
inLanguage | Text | Language 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).
| Property | Type | Notes |
|---|---|---|
courseMode | Text | Delivery format. Accepted values: "online", "onsite", "blended". Greadme warns for any other value. |
instructor | Person | The person teaching this instance. Include name. |
startDate | Date | Start date of this specific offering in ISO 8601 format. |
endDate | Date | End date of this specific offering. |
location | Place or VirtualLocation | Where the course takes place. Use VirtualLocation with a url for online courses; Place with a PostalAddress for in-person. |
offers | Offer | Pricing 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
ItemListas the root@type - At least 3
ListItemobjects — Greadme errors if fewer are present - Each
ListItemneeds a sequentialposition(integer) and a uniqueitem.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 type | Examples |
|---|---|
| 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.
