Course info (Course
and CourseInstance
) structured data
![An illustration of how course info may show up on Google Search](https://developers-dot-devsite-v2-prod.appspot.com/static/search/docs/images/course-info-rich-result.png?authuser=6)
You can help people find your course content by telling Google about your course using course info structured data. When you provide more detailed information about a course, such as reviewer ratings, pricing, and course details, Google can better understand your course and present a rich experience to people with the course info rich result.
There are two course rich result features that use the same schema.org Course
type.
If your site provides information about courses, you can be eligible for both features by
following both implementation guides:
- Course list: A rich result that lists courses from the same website.
- Course info: A carousel that shows detailed course information from a variety of websites.
Feature availability
The course info rich result is available in English in all regions where Google Search is available. We hope to support more non-English courses in the future.
How to add structured data
Structured data is a standardized format for providing information about a page and classifying the page content. If you're new to structured data, you can learn more about how structured data works.
Here's an overview of how to build, test, and release structured data.
- Add the required properties. Based on the format you're using, learn where to insert structured data on the page.
- Follow the guidelines.
- Validate your code using the Rich Results Test and fix any critical errors. Consider also fixing any non-critical issues that may be flagged in the tool, as they can help improve the quality of your structured data (however, this isn't necessary to be eligible for rich results).
- Deploy a few pages that include your structured data and use the URL Inspection tool to test how Google sees the page. Be sure that your page is
accessible to Google and not blocked by a robots.txt file, the
noindex
tag, or login requirements. If the page looks okay, you can ask Google to recrawl your URLs. - To keep Google informed of future changes, we recommend that you submit a sitemap. You can automate this with the Search Console Sitemap API.
Example
Here's an example of a single course info page.
<html> <head> <title>Introduction to Computer Science and Programming</title> <script type="application/ld+json"> { "@context": "https://schema.org/", "@id": "https://www.example.com/advancedCpp", "@type": "Course", "name": "Learn Advanced C++ Topics", "description": "Improve your C++ skills by learning advanced topics.", "publisher": { "@type": "Organization", "name": "CourseWebsite", "url": "www.examplecoursewebsite.com" }, "provider": { "@type": "Organization", "name": "Example University", "url": "www.example.com" }, "image": [ "https://example.com/photos/1x1/photo.jpg", "https://example.com/photos/4x3/photo.jpg", "https://example.com/photos/16x9/photo.jpg" ], "aggregateRating": { "@type": "AggregateRating", "ratingValue": 4, "ratingCount": 1234, "reviewCount": 450 }, "offers": [{ "@type": "Offer", "category": "Paid", "priceCurrency": "EUR", "price": 10.99 }], "totalHistoricalEnrollment": 12345, "datePublished": "2024-03-21", "educationalLevel": "Advanced", "about": ["C++ Coding", "Backend Engineering"], "teaches": ["Practice and apply systems thinking to plan for change", "Understand how memory allocation works."], "financialAidEligible": "Scholarship Available", "inLanguage": "en", "availableLanguage": ["fr", "es"], "syllabusSections": [ { "@type": "Syllabus", "name": "Memory Allocation", "description": "Learn how memory is allocated when creating C++ variables.", "timeRequired": "PT6H" }, { "@type": "Syllabus", "name": "C++ Pointers", "description": "Learn what a C++ pointer is and when they are used.", "timeRequired": "PT11H" } ], "review": [ { "@type": "Review", "author": { "@type": "Person", "name": "Lou S." }, "datePublished": "2024-08-31", "reviewRating": { "@type": "Rating", "bestRating": 10, "ratingValue": 6 } }], "coursePrerequisites": [ "Basic understanding of C++ up to arrays and functions.", "https://www.example.com/beginnerCpp" ], "educationalCredentialAwarded": [{ "@type": "EducationalOccupationalCredential", "name": "CourseProvider Certificate", "url": "www.example.com", "credentialCategory": "Certificate", // offers only needed if the credential costs extra money. "offers": [{ "@type": "Offer", "category": "Paid", "price": 5, "priceCurrency": "USD" }] }], "video": { "@type": "VideoObject", "name": "Video name", "description": "A video previewing this course.", "uploadDate": "2024-03-28T08:00:00+08:00", "contentUrl": "www.example.come/mp4", "thumbnailUrl": "www.example.com/thumbnailurl.jpg" }, "hasCourseInstance": [ { // Blended, instructor-led course meeting 3 hours per day in July. "@type": "CourseInstance", "courseMode": "Blended", "location": "Example University", "courseSchedule": { "@type": "Schedule", "duration": "PT3H", "repeatFrequency": "Daily", "repeatCount": 31, "startDate": "2024-07-01", "endDate": "2024-07-31" }, "instructor": [{ "@type": "Person", "name": "Ira D.", "description": "Professor at X-University", "image": "http://example.com/person.jpg" }] }, { // Online self-paced course that takes 2 days to complete. "@type": "CourseInstance", "courseMode": "Online", "courseWorkload": "P2D" }], // Only required for course programs that link to child courses. "hasPart": [{ "@type": "Course", "name": "C++ Algorithms", "url": "https://www.example.com/cpp-algorithms", "description": "Learn how to code base algorithms in c++.", "provider": { "@type": "Organization", "name": "Example University", "url": "www.example.com" } }, { "@type": "Course", "name": "C++ Data Structures", "url": "https://www.example.com/cpp-data-structures", "description": "Learn about core c++ data structures.", "provider": { "@type": "Organization", "name": "Example University", "url": "www.example.com" } }] } </script> </head> <body> </body> </html>
Guidelines
You must follow these guidelines for your course to be eligible to appear as a course info rich result on Google Search.
Content guidelines
Only educational content that fits the following definition of a course is eligible for the Course info rich result: a series or unit of curriculum that contains lectures, lessons, or modules in a particular subject or topic.
The Course
markup must be on a web page that offers a full, single
course or course program. The
following examples aren't eligible for the course info rich result:
- An academic degree summary page
- A standalone exam page
- A general public event such as "Astronomy Day"
- A single 2-minute "How to make a Sandwich Video"
Structured data type definitions
You must include the required Course
and CourseInstance
properties for your content to be eligible for display as a rich result on Google Search. You can
also include the recommended properties to add more information about your content, which could
provide a better user experience.
Course
A course is an individual unit of curriculum that can be taken by itself, or as part of a program.
The full definition of Course
is available at
schema.org/Course.
Required properties | |
---|---|
name |
The full title of the course. "name": "Intro to Statistics" |
description |
The description of the course.
"description": "This course teaches the basics of statistical thinking." |
provider |
Information about the organization that created the content for the course. "provider": { "@type": "Organization", "name": "Example University", "url": "www.exampleuniversity.com" } |
provider.name |
Text
The name of the course provider. |
offers |
Repeatable Information about the total price to complete the course, including service fees. Don't list a price that is only eligible for some users (for example, 20% off for first time users). Don't include extra certificate fees in this field. If there's an extra charge to earn
a certificate, add that to the "offers": [{ "@type": "Offer", "category": "Paid", "priceCurrency": "EUR", "price": 10.99 }] |
offers.category |
Text
The pricing category of the course. Use one of the following values:
|
hasCourseInstance |
Repeatable Every course must have at least one course instance with information detailing the
course offering. See the required and recommended properties in the
"hasCourseInstance": [{ // Onsite, instructor-led class meeting weekly in August 2023 "@type": "CourseInstance", "courseMode": "Onsite", "location": "Example University", "courseSchedule": { "@type": "Schedule", "duration": "PT5H", "repeatCount": 4, "repeatFrequency": "Weekly", "startDate": "2023-08-01", "endDate": "2023-8-31" }, "instructor": [{ "@type": "Person", "name": "Kai S.", "description": "Professor at X-University", "image": "http://examplePerson.jpg" }] }] |
Recommended properties | |
---|---|
about |
Repeatable Describes the skills that the user will develop by taking the course, if applicable. "about": ["Quantitative Analysis", "Critical Thinking"] |
aggregateRating |
Information about the average course rating based on ratings left by users who have
taken the course, if applicable. Follow the Review snippet guidelines
and list of required and recommended "aggregateRating": { "@type": "AggregateRating", "ratingValue": 4.8, "ratingCount": 255, "reviewCount": 189 } |
availableLanguage |
Repeatable Subtitles, closed captions, or other languages the course is offered in, if applicable. Use the two-letter codes from the list of ISO 639-1 alpha-2 codes. "availableLanguage": ["fr", "es", "de"] |
coursePrerequisites |
Repeatable Any prior knowledge that is needed for the course, if applicable. This can be represented by describing the prior knowledge or linking to another course (or both). "coursePrerequisites": ["Understanding of Algebra concepts like variables and functions", "https://www.coursewebsite.abc/algebra"] |
datePublished |
The date that the course was first published, if applicable. Use the 8601 date format (YYYY-MM-DD). "datePublished": "2019-03-21" |
educationalCredentialAwarded |
Repeatable Information about the certificate or credential the user can receive by completing the course, if applicable. If the award costs extra, specify the extra price. "educationalCredentialAwarded": [{ "@type": "EducationalOccupationalCredential", "name": "CourseProvider Certificate", "url": "www.examplecertificate.com", "credentialCategory": "Certificate", "offers": [{ "@type": "Offer", "category": "Paid", "priceCurrency": "USD", "price": 5 }] }] |
educationalCredentialAwarded.credentialCategory |
Text
The type of award the user will receive, if applicable. Use one of the following values:
|
educationalCredentialAwarded.name |
Text
The name of the award, if applicable. |
educationalCredentialAwarded.offers.category |
Text
The type of pricing for the award, if applicable. Use one of the following categories:
|
educationalCredentialAwarded.offers.price |
Number
The numeric price of the award, if applicable. |
educationalCredentialAwarded.offers.priceCurrency |
Text
The currency of the price of the award, in ISO 4217 currency format (3 letter code), if applicable. |
educationalCredentialAwarded.url |
URL
The link to the award page, if applicable. |
educationalLevel |
The target education level for the course, if applicable. Select one of the following values.
"educationalLevel": "Beginner" |
financialAidEligible |
Any scholarships, special payment plans, or other financial aid opportunities for users looking to take the course, if applicable. "financialAidEligible": "Scholarships available for eligible users." |
image |
Repeatable The URL to an image that is representative of the course, if applicable. Use images that are relevant to the course, rather than logos or captions. Additional image guidelines:
For example: "image": [ "https://example.com/photos/1x1/photo.jpg", "https://example.com/photos/4x3/photo.jpg", "https://example.com/photos/16x9/photo.jpg" ] |
inLanguage |
The main language the course is offered in, if applicable. Use the two-letter codes from the list of ISO 639-1 alpha-2 codes. "inLanguage": "en" |
offers.price |
Number
The numerical price of the course, if applicable. Don't include other information in this field, such as the currency symbol. |
offers.priceCurrency |
Text
The currency of the price of the course, in ISO 4217 currency format (3 letter code), if applicable. |
provider.url |
URL
The URL that links to the home page of the course provider, if applicable. |
publisher |
Information about the organization that publishes and displays the course, if applicable. "publisher": { "@type": "Organization", "name": "Course Website", "url": "www.example.com" } |
publisher.name |
Text
The name of the course publisher, if applicable. |
publisher.url |
URL
The URL that links to the home page of the course publisher, if applicable. |
review |
Repeatable A list of user reviews about the course, if applicable. Follow the review snippet guidelines for more information. "review": [{ "@type": "Review", "author": { "@type": "Person", "name": "Sasha J." }, "datePublished": "2021-09-22", "reviewRating": { "@type": "Rating", "ratingValue": 4 } }] |
syllabusSections |
Repeatable Information about the different modules that make up the course, if applicable. "syllabusSections": [{ "@type": "Syllabus", "name": "Algebra Review", "description": "Review prerequisite Algebra concepts.", "timeRequired": "PT2H30M" }, { "@type": "Syllabus", "name": "Statistics Terms", "description": "Learn the definitions of basic statistics terms.", "timeRequired": "PT5H" }] |
syllabusSections.description |
Text
A description of what the module is about, if applicable. |
syllabusSections.name |
Text
The name of the course module, if applicable. |
syllabusSections.timeRequired |
Duration
Use the 8601 duration format, if applicable.
For example, |
teaches |
Repeatable The learning outcomes or specific knowledge the user will learn by taking the course, if applicable. "teaches": ["How to use visualization tools and graphs", "Why stats is important"] |
totalHistoricalEnrollment |
The total number of users that have enrolled over the lifetime of the course, if applicable. "totalHistoricalEnrollment": 80032 |
video |
A video preview or trailer for the course, if applicable. Follow the "video": { "@type": "VideoObject", "name": "Video name", "description": "A video previewing this course.", "uploadDate": "2022-03-28T08:00:00+08:00", "contentUrl": "www.videourl.mp4", "thumbnailUrl": "www.thumbnailurl.jpg" } |
CourseInstance
The full definition of CourseInstance
is available at
schema.org/CourseInstance.
Every course must have at least one CourseInstance
with the required properties filled out.
Required properties | |
---|---|
courseMode |
The medium through which the course will be delivered. Use one of the following values:
If the class is "courseMode": "Online" |
courseSchedule |
Information about how long the course takes the average user to complete, given a suggested pacing. Include start and end dates for courses that are on a fixed timeline. Here's an example of a paced course that can be started at any time: // This course takes 6 weeks to complete. "courseSchedule": { "@type": "Schedule", "repeatCount": 6 "repeatFrequency": "Weekly", } Here's an example of a paced course during a set time: // This course expects 1 hour per day during July 2023 "courseSchedule": { "@type": "Schedule", "duration": "PT1H", "repeatCount": 31 "repeatFrequency": "Daily", "startDate": "2023-07-01", "endDate": "2023-07-31" } |
courseSchedule.repeatCount |
Integer
The numerical value for how long the course lasts for, in |
courseSchedule.repeatFrequency |
Text
The
|
courseWorkload |
Text
This field represents the total time to watch all videos and complete all assignments and exams for the course. Use the 8601 duration format. "courseWorkload": "PT22H" |
Recommended properties | |
---|---|
courseSchedule.duration |
Duration
The suggested pacing for how long the average user can expect to spend in Don't specify the entire length of the course with this property. Use the |
courseSchedule.endDate |
Date
The end date for the course, in 8601 date format (YYYY-MM-DD), if applicable. |
courseSchedule.startDate |
Date
The start date for the course, in 8601 date format (YYYY-MM-DD), if applicable. |
image |
URL
The URL that links to an image of the instructor, if applicable. Additional image guidelines:
For example: "image": [ "https://example.com/photos/1x1/photo.jpg", "https://example.com/photos/4x3/photo.jpg", "https://example.com/photos/16x9/photo.jpg" ] |
instructor |
Repeatable Information about the instructor for the course, if applicable. "instructor": [{ "@type": "Person", "name": "Dana A.", "description": "Professor at X-University", "image": "http://examplePerson.jpg" }] |
instructor.description |
Text
The description of the instructor and their credentials, if applicable. |
instructor.name |
Text
The name of the instructor, if applicable. |
location |
The name or address (or both) of the physical location where the course will be taught, if applicable. "courseMode": "Blended", "location": "Example High School" |
Course Program
A course program is a collection of child courses. The child courses must be standalone courses with distinct URLs and landing pages.
If your web page is a course program, include the following required properties (in addition
to the other required properties listed in the Course
and
CourseInstance
sections).
Required properties | |
---|---|
hasPart |
Repeatable The list of child courses that are a part of this program. "@context": "https://schema.org/", "@type": "Course", "name": "Learning Pathway: Knitting", "url": "www.example.com/knitprogram" // Fill the other required Course and CourseInstance properties "hasPart": [{ "@type": "Course", "name": "Intro to Knitting", "url": "www.example.com/knitbasics", "description": "Learn the basics of how to knit." }, { "@type": "Course", "name": "Knit a Sweater", "url": "www.example.com/knitsweater", "description": "Learn to knit an entire sweater." }] |
hasPart.name |
Text
The full title of the child course. |
hasPart.url |
URL
The URL that links to the child course landing page. |
Recommended properties | |
---|---|
hasPart.description |
Text
A brief description of what the child course covers, if applicable.
|
Monitor rich results with Search Console
Search Console is a tool that helps you monitor how your pages perform in Google Search. You don't have to sign up for Search Console to be included in Google Search results, but it can help you understand and improve how Google sees your site. We recommend checking Search Console in the following cases:
- After deploying structured data for the first time
- After releasing new templates or updating your code
- Analyzing traffic periodically
After deploying structured data for the first time
After Google has indexed your pages, look for issues using the relevant Rich result status report. Ideally, there will be an increase of valid items, and no increase in invalid items. If you find issues in your structured data:
- Fix the invalid items.
- Inspect a live URL to check if the issue persists.
- Request validation using the status report.
After releasing new templates or updating your code
When you make significant changes to your website, monitor for increases in structured data invalid items.- If you see an increase in invalid items, perhaps you rolled out a new template that doesn't work, or your site interacts with the existing template in a new and bad way.
- If you see a decrease in valid items (not matched by an increase in invalid items), perhaps you are no longer embedding structured data in your pages. Use the URL Inspection tool to learn what is causing the issue.
Analyzing traffic periodically
Analyze your Google Search traffic using the Performance Report. The data will show you how often your page appears as a rich result in Search, how often users click on it and what is the average position you appear on search results. You can also automatically pull these results with the Search Console API.Troubleshooting
If you're having trouble implementing or debugging structured data, here are some resources that may help you.
- If you're using a content management system (CMS) or someone else is taking care of your site, ask them to help you. Make sure to forward any Search Console message that details the issue to them.
- Google does not guarantee that features that consume structured data will show up in search results. For a list of common reasons why Google may not show your content in a rich result, see the General Structured Data Guidelines.
- You might have an error in your structured data. Check the list of structured data errors and the Unparsable structured data report.
- If you received a structured data manual action against your page, the structured data on the page will be ignored (although the page can still appear in Google Search results). To fix structured data issues, use the Manual Actions report.
- Review the guidelines again to identify if your content isn't compliant with the guidelines. The problem can be caused by either spammy content or spammy markup usage. However, the issue may not be a syntax issue, and so the Rich Results Test won't be able to identify these issues.
- Troubleshoot missing rich results / drop in total rich results.
- Allow time for re-crawling and re-indexing. Remember that it may take several days after publishing a page for Google to find and crawl it. For general questions about crawling and indexing, check the Google Search crawling and indexing FAQ.
- Post a question in the Google Search Central forum.