Skip to content
SEO Madmanby Adam Hafez
Free tool

Course schema validator for Google course lists

Course schema validator: paste Course JSON-LD and check name, description, provider and the 60 character display limit. Free, runs in your browser.

Runs entirely in your browser. Nothing you enter is uploaded, logged or stored.

Parsed with the browser's own JSON.parse against Google's documented property tables for Course. Nothing you type is sent anywhere.

Key takeaways

  • Google's course list documentation names name and description as the required Course properties and lists provider as recommended.
  • The same page's technical guidelines say each course must have valid name and provider properties, so a missing provider is worth fixing.
  • Google gives the course description a display limit of 60 characters, so longer text is valid but may be cut when shown.
  • Google says you must mark up at least three courses, on separate detail pages or on one all-in-one page.
  • This checker reads one Course object at a time and cannot see the ItemList carousel markup a summary page also needs.

What it takes

  • A pasted Course JSON-LD object

More tools

All of them free, all of them browser-only.

Browse the tools

How to use it

  1. 1Paste the Course JSON-LDCopy the ld+json script that describes one course, not the surrounding page markup or a list of several courses.
  2. 2Fix name and descriptionAdd both, since Google documents them as required, and keep the description short enough to read within its display limit.
  3. 3Add a named providerInclude a provider Organization with a name so Google can show who publishes the course content.
  4. 4Repeat for the other coursesMark up at least three courses across your pages, because Google's course list feature depends on that minimum.

What this Course schema validator checks

The checks come from Google’s course list documentation, which defines two required Course properties and one recommended one. The tool parses the pasted JSON with the browser’s own JSON.parse, finds the first node whose @type is Course, and reports one row per rule:

  • @type is Course. Without a Course node nothing else can be checked, so this is a Problem.
  • name and description. Both are required by Google’s property table. A missing one is a Problem.
  • provider. Listed as recommended: “The organization that publishes the source content of the course.” A missing provider is Info.
  • description display length. Google gives the description a display limit of 60 characters. The tool counts characters and marks anything longer as Info, not as an error.
  • provider.name. When a provider exists but has no name, the tool raises a Warning.
  • Three courses for the list feature. Google says “You must mark up at least three courses.” One pasted node cannot prove that, so this row always reads “Not testable here”.

How to read the results

Each row carries one of four badges. Pass means the rule is met. Problem marks a missing required property, the rows to fix first. Warning marks something present but incomplete, here a provider with no name. Info marks a recommendation or a limit Google documents without making it required.

Read the provider row with care. Google’s property table calls provider recommended, but the technical guidelines on the same page say “Each course must have valid name and provider properties.” The tool follows the table, so a missing provider shows as Info, yet the guidelines are the stricter statement. Add one.

If the JSON does not parse, the tool shows “Not valid JSON” with the parser’s message and clears the rows until the input is fixed.

Worked example

The tool loads with this Course: name “Technical SEO basics”, description “Learn crawling, indexing and rendering.”, and a provider Organization named “SEO Madman Academy”. It returns:

  • @type is Course: Pass, “Found”.
  • name and description: Pass, “Present”.
  • provider: Pass, “Present”.
  • description display length: Pass, “39 characters”.
  • provider.name: Pass, “Present”.
  • Three courses for the list feature: Info, “Not testable here”.

Delete the provider block and the provider row turns to Info “Missing”, while the provider.name row disappears, because it only runs when a provider exists. Lengthen the description past 60 characters and the length row turns to Info with the new count.

Common mistakes it catches

  • A missing name or description, the two properties Google requires.
  • A provider with no name. Google’s own examples always give the provider Organization a name, such as a university.
  • A description written for a landing page. Anything past 60 characters may be cut in display.
  • Pasting the wrong type. A page that marks courses up as something else returns “No Course node found”.

Some rules sit outside what a pasted object can show. Google requires Carousel markup on a summary page or an all-in-one page, and says course titles must not carry promotional phrases, prices or discounts, such as “Learn ukulele - only $30!”. Its content guidelines also say a general public event or a single short how-to video is not a course. Check those by reading the page.

Sources

  1. 1.Course list (Course) structured data - Google Search CentralPrimary
  2. 2.Latest Google Search documentation updates - Google Search Central

Frequently asked questions

Is provider required for Course markup?

Google's property table lists provider as recommended, so this checker reports a missing one as Info. The same page's technical guidelines say each course must have valid name and provider properties, so treat that Info row as something to fix.

Does a long description make the markup invalid?

No. The 60 character figure is a display limit, so longer text stays valid but may be cut when shown. The checker reports it as Info with the exact character count.

Can I check several courses at once?

No. The checker reads the first Course node it finds in a single object, a top-level array or an @graph list. Paste each course separately to check them all.

Why does my ItemList page say no Course node was found?

The checker looks for Course at the top level only. On an all-in-one page each Course sits inside itemListElement, so paste one of those Course objects on its own instead.

Is this the same as Google's course info rich result?

No. Google removed the separate course info documentation in September 2025 because that feature is no longer shown. The course list documentation this tool follows is a different, still published page.