С ростом онлайн-образования (Coursera, Skillbox, Stepik, edX, GeekBrains) Google выделил учебные курсы в отдельную вертикаль поиска. Правильная разметка Course даёт попадание в специальный Rich Result с указанием провайдера, длительности и типа обучения. Официальные требования — Google Search Central: Course.

У Course есть особенность: сам тип описывает «абстрактный курс» (программа обучения), а конкретные потоки (даты запуска, преподаватели, формат) — через связанные CourseInstance. Один курс — несколько потоков.

Пример JSON-LD (простой курс)

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Course",
  "name": "Введение в TypeScript",
  "description": "Курс для JS-разработчиков: типы, интерфейсы, generics, миграция проекта на TS.",
  "provider": {
    "@type": "Organization",
    "name": "FRUNTEND",
    "sameAs": "https://fruntend.com"
  },
  "url": "https://fruntend.com/courses/typescript-intro"
}
</script>

Обязательные свойства

  • name — название курса.
  • description — текстовое описание, минимум ~50 символов.
  • provider — провайдер обучения как Organization с обязательным name. Рекомендуется добавить sameAs с основным доменом.

Пример с CourseInstance

Если курс существует в нескольких потоках — например, стартует в разные даты или доступен в разных форматах (self-paced vs live-webinar) — добавляется массив hasCourseInstance:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Course",
  "name": "Введение в TypeScript",
  "description": "Курс для JS-разработчиков...",
  "provider": {
    "@type": "Organization",
    "name": "FRUNTEND"
  },
  "hasCourseInstance": [
    {
      "@type": "CourseInstance",
      "courseMode": "Online",
      "startDate": "2026-09-01",
      "endDate": "2026-11-01",
      "instructor": {
        "@type": "Person",
        "name": "Аня Петрова"
      },
      "offers": {
        "@type": "Offer",
        "price": "12000",
        "priceCurrency": "RUB"
      }
    },
    {
      "@type": "CourseInstance",
      "courseMode": "OnDemand",
      "courseWorkload": "PT40H"
    }
  ]
}
</script>

courseMode — enumeration: Online, Onsite, Blended, OnDemand. courseWorkload — длительность в ISO 8601 duration-формате (PT40H = 40 часов, P4W = 4 недели).

Что попадает в SERP

  • Course Rich Result — карточка с названием, провайдером, длительностью, форматом (онлайн/офлайн), звёздами рейтинга.
  • Google Courses — специальная вертикаль в некоторых регионах (США, UK, Индия). Требует полной разметки с CourseInstance и часто — наличия offers.
  • AggregateRating — можно добавить как отдельное свойство внутри Course. Звёзды рейтинга в SERP сильно повышают CTR.

Типовые ошибки

  • Забыть description. Короче ~50 символов — Google не считает валидным.
  • Provider как строка. Только объект { "@type": "Organization", "name": "..." }.
  • courseWorkload в неверном формате. Только ISO 8601 duration — начинается с P. Формат вроде «40 часов» или «40h» — ошибка.
  • Смешивание Course и CourseInstance. Свойства уровня «конкретного потока» (startDate, instructor) должны идти в CourseInstance, не в Course.