SEO Tools

Video Schema Generator

Use this free Video Schema Generator to create valid VideoObject JSON-LD structured data for videos on your site. Add your title, thumbnail, upload date, duration, and key moments, then copy markup that makes your video eligible for Google's video rich results. No sign-up required.

Key Moments Support Video Rich Results 100% Free

Basic Information

Video URLs

Format: PT5M30S = 5 minutes 30 seconds

Additional Information

Comma-separated ISO 3166 country codes. Leave blank for no restriction.

Key Moments (Clips)

Seek Action

Live Broadcast

Schema Preview

No Schema added yet

Why You Are Here

Video markup earns visibility across more surfaces than almost any other structured data type. A correctly marked-up video can appear in the main search results with a thumbnail, in Google Images, in the dedicated Video tab, and in Discover. Add key moments and it gains clickable timestamps beneath the result, letting someone jump straight to the part they want.

That last feature is the one worth chasing. A result offering four labelled jump points takes up considerably more space than a plain link and answers the searcher's question before they have clicked.

The first situation is a site hosting or embedding video with no structured data, where Google has to infer that a video exists at all rather than being told.

The second is chasing key moments specifically, which needs more than a basic VideoObject and has prerequisites most pages do not list.

The third is fixing markup written before February 2026, when Google deprecated the property most guides still recommend for view counts.

What This Tool Does

The Video Schema Generator builds valid VideoObject JSON-LD from a simple form.

Enter the video title, thumbnail URL, upload date, description, duration, and content or embed URL, add key moment segments if you want them, and the tool assembles correctly structured JSON-LD with Clip objects nested where needed and the script tag included. Copy it and paste it into your page.

Everything runs in your browser. Nothing is uploaded or stored.

Only Three Properties Are Required

Property Required

name

REQUIRED

thumbnailUrl

REQUIRED

uploadDate

REQUIRED

Those three establish eligibility. Everything beyond them improves what the result looks like and what features it can access.

The interactionCount Deprecation

This one is recent enough that most published guidance has not caught up.

interactionCount was deprecated in Google's video documentation update of 13 February 2026

Use interactionStatistic instead.

Old, deprecated

"interactionCount": "4521"

Current

"interactionStatistic": {
  "@type": "InteractionCounter",
  "interactionType": { "@type": "WatchAction" },
  "userInteractionCount": 4521
}
The newer form is more verbose but also more precise, since it states what kind of interaction is being counted rather than leaving it implied. If you have video markup written before 2026, this is worth checking.

Property Reference

Property Status Notes

name

REQUIRED

The video title

thumbnailUrl

REQUIRED

Must be crawlable and indexable

uploadDate

REQUIRED

ISO 8601 with timezone offset

description

Recommended

What the video covers

duration

Recommended

ISO 8601 duration, PT4M32S

contentUrl

Recommended

Direct link to the video file

embedUrl

Recommended

Player embed URL

interactionStatistic

Recommended

View count, replaces interactionCount

expires

Recommended

Only if the video genuinely expires

hasPart

Optional

Clip objects for key moments

potentialAction

Optional

SeekToAction for automatic key moments

publication

Optional

BroadcastEvent for livestreams

regionsAllowed

Optional

Where the video may be shown

isFamilyFriendly

Optional

True or false

Supply contentUrl, embedUrl, or both

contentUrl points at the actual video file, embedUrl at the player. Google's ability to fetch the file matters.
Only set expires if the video really does expire

Marking a video as expired removes it from search results, and doing that by accident to evergreen content is a costly mistake.

Key Moments — Clip or SeekToAction

Key moments turn a single search result into several labelled jump points. There are two ways to get them, and they are not equivalent.

  Clip SeekToAction

How it works

You define each segment yourself

Google identifies segments automatically

Control

Full: you set start, end, and label

None: Google chooses

What you supply

Every segment explicitly

Your URL timestamp pattern

Language support

ALL languages Google Search supports

TWELVE languages only

Best for

Content where the sections matter

Large libraries where manual work is impractical

The language limitation is the deciding factor for many sites

SeekToAction is supported in English, Spanish, Portuguese, Italian, Chinese, French, Japanese, German, Turkish, Korean, Dutch, and Russian. If you publish in Arabic, Hindi, Polish, Urdu, or any other language, SeekToAction will not produce key moments and Clip is your only route.

Three prerequisites apply to both

Required for key moments

• The video must be at least 30 seconds long. Shorter videos are not eligible at all
• Your URL must support deep-linking to a timestamp, in the form example.com/video?t=30
• The VideoObject must sit on a page where the video can actually be watched
One Clip-specific rule

No two clips for the same video on the same page may share a start time.
If your video is on YouTube

You do not need either. Timestamps written in the YouTube description generate key moments on their own.
To opt out of key moments entirely

Including any Google generates automatically, use the nosnippet meta tag.

Example — VideoObject With Key Moments

{
  "@context": "https://schema.org",
  "@type": "VideoObject",
  "name": "How to Repoint Brickwork: Full Tutorial",
  "description": "A complete walkthrough of raking out and
                   repointing a brick wall.",
  "thumbnailUrl": [
    "https://example.com/thumbs/repointing-1x1.jpg",
    "https://example.com/thumbs/repointing-16x9.jpg"
  ],
  "uploadDate": "2026-05-12T09:00:00+01:00",
  "duration": "PT14M22S",
  "contentUrl": "https://example.com/videos/repointing.mp4",
  "embedUrl": "https://example.com/embed/repointing",
  "interactionStatistic": {
    "@type": "InteractionCounter",
    "interactionType": { "@type": "WatchAction" },
    "userInteractionCount": 18420
  },
  "hasPart": [
    {
      "@type": "Clip",
      "name": "Tools you will need",
      "startOffset": 0,
      "endOffset": 95,
      "url": "https://example.com/videos/repointing?t=0"
    },
    {
      "@type": "Clip",
      "name": "Raking out the old mortar",
      "startOffset": 95,
      "endOffset": 412,
      "url": "https://example.com/videos/repointing?t=95"
    },
    {
      "@type": "Clip",
      "name": "Mixing the mortar",
      "startOffset": 412,
      "endOffset": 640,
      "url": "https://example.com/videos/repointing?t=412"
    }
  ]
}
startOffset and endOffset are in seconds from the start of the video. Each clip's url should deep-link to its own start point.

SeekToAction alternative

"potentialAction": {
  "@type": "SeekToAction",
  "target":
    "https://example.com/videos/repointing?t={seek_to_second_number}",
  "startOffset-input": "required name=seek_to_second_number"
}

// Tells Google where the timestamp sits in your URL pattern
// so it can build its own links.
// Use Clip OR SeekToAction, not both.

Google Must Be Able to Fetch the Video File

This requirement causes more silent failures than any other, because nothing warns you when it is not met.

Google needs to fetch the actual bytes of your video file

This enables video previews and key moments. Not the page, not the player: the file itself.
Common reasons it cannot

• The video file directory is disallowed in robots.txt
• The player loads the file through JavaScript in a way Google cannot resolve
• The file sits behind authentication or a signed URL that expires
• A CDN configuration blocks Google's fetchers
Google does not expose your video file in search results, and anyone clicking a video result still lands on your page to watch it. Allowing the fetch does not put your file anywhere you did not intend.

Livestreams — The LIVE Badge

BroadcastEvent markup adds a red LIVE badge to a livestream's search result, which is a strong signal for real-time content.

"publication": {
  "@type": "BroadcastEvent",
  "isLiveBroadcast": true,
  "startDate": "2026-08-14T19:00:00+01:00",
  "endDate": "2026-08-14T21:00:00+01:00"
}
This one has an operational requirement most sites are not set up for

The LIVE badge depends on notifying Google through the Indexing API when the stream starts and ends. Markup alone will not produce it, because Google has no other way to know a stream has gone live at that moment.
If you are not integrating the Indexing API, the BroadcastEvent markup is still valid and still describes the content correctly, but the badge will not appear.

Common Mistakes to Avoid

Still Using interactionCount for View Counts

interactionCount was deprecated in Google's video documentation update of 13 February 2026, and the replacement is interactionStatistic with a nested InteractionCounter. Because the deprecation is recent, most published examples and many CMS templates still emit the old property. If your video markup predates 2026, this is the first thing to check.
Chasing Key Moments Without Meeting the Prerequisites

Key moments require a video of at least 30 seconds, a URL that supports deep-linking to a timestamp, and a page where the video is actually watchable. Adding Clip markup to a 20-second video, or to a player whose URL cannot carry a timestamp, produces nothing at all. Check all three before writing the segments.
Setting expires on Videos That Do Not Expire

The expires property tells Google the video is no longer available after a given date, and Google removes expired videos from search results. Setting it on evergreen content, or letting a template populate it automatically, quietly removes videos from search once the date passes. Only use it when the video genuinely becomes unavailable.

Quick Reference

Item Detail

Type

VideoObject

Rich result

Search, Images, Video tab, Discover

Required

name, thumbnailUrl, uploadDate

View counts

interactionStatistic, not interactionCount

Duration

ISO 8601, PT4M32S

Key moments

Clip or SeekToAction

Clip

All languages, full control

SeekToAction

Twelve languages, automatic

Minimum length for key moments

30 seconds

URL

Must deep-link to a timestamp

File access

Google must be able to fetch it

expires

Only if it genuinely expires

LIVE badge

BroadcastEvent plus Indexing API

Opt out

nosnippet meta tag

Frequently Asked Questions

What is a video schema generator?

A video schema generator is a free online tool that turns your video details into valid VideoObject JSON-LD structured data. You enter the title, thumbnail, upload date, duration, and video URL, and this Video Schema Generator produces correctly structured Schema.org markup that makes your page eligible for Google's video rich results.

Which properties are required for video schema?

Three: name, thumbnailUrl, and uploadDate. Those establish eligibility. Beyond them, description, duration, contentUrl or embedUrl, and interactionStatistic are all recommended and shape how the result appears and which features it can access.

How do I get key moments in my video results?

Two routes exist. Clip markup lets you define each segment with a start time, end time, and label. SeekToAction tells Google your URL timestamp pattern so it can identify segments automatically. Both require a video of at least 30 seconds, a URL supporting deep-linking to a timestamp, and a page where the video is watchable.

Should I use Clip or SeekToAction?

Use Clip when the segments matter and you want control over the labels, or when you publish in a language SeekToAction does not support. SeekToAction covers only twelve languages including English, Spanish, French, German, and Japanese, whereas Clip works in every language Google Search supports. For large video libraries where manual segmenting is impractical, SeekToAction saves considerable effort.

Why is interactionCount no longer recommended?

Google deprecated interactionCount in its video documentation update of 13 February 2026. View counts should now use interactionStatistic with a nested InteractionCounter specifying the interaction type. The newer form is more verbose but states explicitly what is being counted. Markup written before 2026 will often still carry the deprecated property.

Does Google need access to my actual video file?

Yes. Google must be able to fetch the bytes of the video file to enable previews and key moments, which means the file must not be blocked in robots.txt, hidden behind authentication, or loaded in a way Google cannot resolve. Google does not expose the file in search results, and viewers still land on your page to watch it.

How do I get the LIVE badge on a livestream?

Add BroadcastEvent markup with isLiveBroadcast set to true and the stream's start and end dates. The badge also requires notifying Google through the Indexing API when the stream begins and ends, since markup alone gives Google no way to know a stream has just gone live. Without that integration the markup remains valid but the badge will not appear.

Do I need video schema for videos hosted on YouTube?

Not for the key moments feature, since timestamps written in a YouTube description generate those on their own. If you embed a YouTube video on your own page and want that page to be eligible for video rich results, VideoObject markup on your page still helps Google understand the video is there. Markup from this Video Schema Generator works for both self-hosted and embedded video.

Comments

Login to leave a comment

No comments yet. Be the first to comment!