FREE TOOL · NO SIGNUP · INSTANT

Generate Course JSON-LD for Education Rich Results

Turn your course name, provider, price, and schedule into valid schema.org Course structured data — copy the script tag or download the .json in one click.

Course details

Fully remote — students attend from anywhere.

Example schema — enter your course name above to generate your own.
Course JSON-LDschema.orgUSD 149

Validation

  • Valid Course schema — all required and recommended fields are present.

Tip: after pasting the snippet on your course page, validate it with Google's Rich Results Test.

JSON-LD output

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Course",
  "name": "SEO Foundations: Rank, Convert & Scale in 2026",
  "description": "A hands-on course that takes you from keyword research and on-page optimization to technical SEO, content strategy, and measurable growth — with templates and real-world projects.",
  "url": "https://www.semlypro.com/courses/seo-foundations",
  "provider": {
    "@type": "Organization",
    "name": "SemlyPro Academy",
    "sameAs": "https://www.semlypro.com",
    "url": "https://www.semlypro.com"
  },
  "inLanguage": "en",
  "offers": {
    "@type": "Offer",
    "category": "Paid",
    "price": "149",
    "priceCurrency": "USD",
    "url": "https://www.semlypro.com/courses/seo-foundations",
    "availability": "https://schema.org/InStock"
  },
  "hasCourseInstance": {
    "@type": "CourseInstance",
    "courseMode": "Online",
    "courseWorkload": "PT12H",
    "instructor": {
      "@type": "Person",
      "name": "Anil Varma"
    },
    "inLanguage": "en"
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.8",
    "ratingCount": "326",
    "bestRating": "5",
    "worstRating": "1"
  }
}
</script>
The Complete Guide

Course Schema, Explained: Get Your Courses Into Google Rich Results

5 MIN READ

Understand with AI

Discuss with your preferred AI assistant

4 results
Higher visibility

The Courses carousel can surface up to four courses per provider above the standard listings.

3
Required fields

Just name, description, and provider are required to start — the rest strengthen eligibility.

< 2 min
Setup time

Fill the form, copy the validated JSON-LD, and paste it — no developer required.

Course schema is the structured-data markup that tells Google a page describes an educational course — its name, who provides it, what it costs, and how it is delivered. When you add it correctly, your courses become eligible for the Course rich result: a prominent listing in Google Search and the dedicated Courses carousel that surfaces title, provider, price, and ratings right in the results.

This guide explains what Course JSON-LD is, which properties Google actually requires, how to mark up both self-paced and scheduled courses, and the mistakes that quietly disqualify pages from rich results. Paste the markup our generator produces, validate it, and you are done.

What Is Course Schema?

Course schema is a block of JSON-LD based on the schema.org Course type. It sits inside a <script type="application/ld+json"> tag in your page's HTML and describes the course in a machine-readable way. Google reads it to understand that the page is a course, then uses the data to build richer, more clickable search listings.

There are two related rich-result formats. The Course list format groups several courses (for category or "all courses" pages) into a carousel. The Course info format enriches a single course page with details like price, duration, and reviews. Both are powered by the same Course type — the difference is how many courses appear on the page.

Google has a short list of properties that must be present, plus several that strengthen eligibility. Get the required ones right first.

PropertyRequirementWhat it is
nameRequiredThe full title of the course.
descriptionRequiredA clear summary of what the course covers.
providerRequiredThe organization or person offering the course.
offersRecommendedPrice and currency — use a "Free" category for no-cost courses.
hasCourseInstanceRecommendedHow the course runs: mode, plus a workload or start/end dates.
aggregateRatingRecommendedAverage rating and review count for social proof.

The single most overlooked piece is hasCourseInstance. Google wants to know whether a course is self-paced or scheduled, and it expects a courseMode ("Online", "Onsite", or "Blended") on every instance.

How to Mark Up a Course, Step by Step

1. Start with name, description, and provider

Use the exact course title users see on the page for name, write a one- or two-sentence description that says what students learn, and set the provider to your school, brand, or your own name. Add the provider's website so Google can connect the course to a known entity.

2. Add an Offer — even for free courses

Price is one of the most valuable fields because it shows directly in the carousel. For paid courses, include a numeric price and an ISO 4217 priceCurrency such as USD, EUR, or INR. For free courses, set the price to 0 and mark the offer category as Free — that "Free" label is a genuine click magnet.

3. Describe how the course is delivered

Inside hasCourseInstance, set courseMode to match reality. If the course is self-paced, add a courseWorkload (an ISO 8601 duration like PT12H or a human phrase like "6 weeks"). If it runs on fixed dates, add startDate and endDate instead.

4. Layer in language, instructor, and ratings

Specify inLanguage with a BCP-47 tag (e.g. "en"), name the instructor, and — only if the ratings are genuinely shown on the page — add an aggregateRating with a value between 1 and 5 and a real review count.

5. Validate before you ship

Paste the generated <script> into your page's HTML, then run it through Google's Rich Results Test and the Schema Markup Validator. Fix any errors, deploy, and request indexing in Search Console.

Course Schema Best Practices

  • Mark up what's on the page. The schema must match the visible content — never invent prices, dates, or ratings.
  • Use real ratings only. Fabricated or site-wide ratings on a single course are a manual-action risk.
  • Keep names concise and unique. Each course should have a distinct, descriptive name.
  • Point the Offer URL at a live page. The course page must be crawlable and not blocked by robots.txt.
  • Pick the right mode. "Online", "Onsite", and "Blended" are the values Google understands.

Common Course Schema Mistakes

  • Omitting hasCourseInstance or its courseMode, so the course never qualifies for the rich result.
  • Adding a paid price with no currency, which makes the Offer invalid.
  • Mixing date-only and on-demand fields — a self-paced course needs a workload, not start/end dates.
  • Marking up courses that are gated or removed, leaving the schema pointing at a dead page.
  • Reusing one schema block across many courses instead of generating unique markup per page.

Expert Tips

Always add a course instance

Google needs hasCourseInstance with a courseMode to show the Course rich result. Set Online, Onsite, or Blended, then add a workload for self-paced courses or start/end dates for scheduled ones.

Validate before you publish

Run the generated snippet through Google’s Rich Results Test and the Schema Markup Validator. Catching a missing currency or invalid date now saves a re-crawl later.

Frequently Asked Questions

What is Course schema used for?

Course schema is JSON-LD markup that tells Google a page describes an educational course. It makes the page eligible for the Course rich result and the Courses carousel, which can show the course name, provider, price, and ratings directly in search results — improving visibility and click-through.

Is Course structured data required to rank?

No. Schema markup does not directly boost rankings, but it makes your courses eligible for richer, more prominent listings that attract more clicks. For education sites, that added real estate in the SERP is often the difference between being noticed and being scrolled past.

What's the difference between a free and paid course in the schema?

Both use an offers node. A paid course needs a numeric price and a priceCurrency like USD or EUR. A free course sets the price to 0 and uses the "Free" offer category — Google can then display a "Free" badge in the carousel.

How do I mark up a self-paced versus a scheduled course?

Both use hasCourseInstance with a courseMode . A self-paced course adds a courseWorkload (e.g. PT12H or "6 weeks") and no dates. A scheduled course adds startDate and endDate instead. Our generator switches between the two automatically based on the schedule you choose.

Related guides

Related tools