Skip to the tool
OnPageKit

Video Schema Generator

VideoObject JSON-LD with key moments.

required
required, absolute URLs
required, ISO 8601
h, min, s
recommended
the media file
the player
optional, Clip

Each moment ends where the next begins, and the last at the video's duration.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "VideoObject"
}
</script>
  • No description. Google recommends one, and it is often the text shown under the video.
  • No duration. Google recommends it, and the last key moment needs it to know where it ends.
  • Neither contentUrl nor embedUrl. Google needs one of them to fetch the video itself.

Everything checked above is syntax and schema.org conformance. Video results and key moments are awarded by Google against the live page, so run the published URL through its Rich Results Test before counting on them.

Everything runs in your browser. Nothing you type is sent to a server.

Found a bug in this tool? Report it.

Share this tool

A video schema generator with the conversions built in

This video schema generator writes the VideoObject JSON-LD that lets a search engine list a video with its thumbnail, its length and, where it has chapters, links straight to each one. Type the details in the form and the block rebuilds as you go, ready to paste into the page that hosts the player. The work happens in your browser; nothing you type leaves it.

Video structured data looks simple until you write it by hand. Three fields are not text at all, and they are where most hand-written blocks go wrong.

Duration is ISO 8601, not minutes

duration does not take 4:30 or 270. It takes PT4M30S. Type hours, minutes and seconds as plain numbers and the string is assembled for you, with seconds over 59 carried up into minutes. Leave the duration out and the block is still valid, but the result loses its length badge and the last key moment has nothing to end on.

uploadDate wants a time zone

uploadDate is required, and Google reads a date without an offset in its own time zone. For a video published late in the evening that can move it to the previous or next day. Write 2026-09-23T08:00:00+01:00, or Z for UTC, and the moment is unambiguous. A bare date is accepted, with a warning, because sometimes that is all a video host gives you.

Key moments as Clip, done for you

The video key moments schema uses hasPart with one Clip per chapter. Each clip needs a name, a startOffset in seconds, and a url that opens the video at that second. The tool asks for the page the video plays on and appends t= for every chapter, which is the pattern Google documents. Times are typed the way you read them off the player, 1:30 or 1:02:03, and converted to seconds.

It also fills in endOffset. Each chapter ends where the next one starts, and the last one ends at the video's duration, so two chapters can never overlap and none can run past the end. Chapters typed out of order are sorted, two chapters on the same second are flagged, and a chapter that starts after the video ends is an error rather than a silent mistake.

If your video host already exposes a timestamped URL pattern, Google can also find key moments on its own through a SeekToAction. The explicit clip list is the version you control, and the one this tool writes.

Thumbnails and URLs

thumbnailUrl accepts several images, and supplying more than one crop is harmless. Every URL, thumbnail, file and player, must be absolute; a relative path is resolved by nobody. contentUrl points at the media file and embedUrl at the player; the videoobject JSON-LD block is valid with either, and Google recommends at least one.

Conformance here, eligibility at Google

The checks on the right cover syntax, value formats and the fields Google lists as required or recommended. Whether the video earns a rich result, or key moments, is decided against the live page. After publishing, run it through Google's Rich Results Test, or paste the block into the structured data validator first. A video embedded in a post can sit alongside markup from the article schema generator, and the Open Graph generator covers how the page looks when it is shared.

Frequently asked questions

Which VideoObject fields does Google require?

Three: name, thumbnailUrl and uploadDate. Description, duration, contentUrl and embedUrl are recommended, and in practice one of the two URLs matters most, because it is how Google fetches the video to understand it. A block with only the required three can be valid and still never produce a video result.

How do I write a video duration in schema?

As an ISO 8601 duration: PT4M30S for four and a half minutes, PT1H2M3S for an hour, two minutes and three seconds. PT opens the time part and each unit carries its letter. This generator writes it from plain hours, minutes and seconds, so 90 seconds typed becomes PT1M30S.

How do key moments work in structured data?

Each chapter is a Clip inside hasPart, with a name, a startOffset and endOffset in seconds, and a url that opens the video at that point. Type the chapters as you would read them off the player, such as 1:30, and the tool converts the times, sorts them and ends each one where the next begins.

What is the difference between contentUrl and embedUrl?

contentUrl points at the media file itself, such as an MP4. embedUrl points at a player, such as the iframe address your video host gives you. Supply whichever you have, or both; Google recommends at least one so it can reach the actual video rather than only the page around it.

Is my video data sent anywhere?

No. The JSON-LD is built inside this browser tab. Nothing is uploaded, fetched or stored.

Related tools

Updated