Guide : VideoObject Schema

How to implement VideoObject schema pour Google's video résultats enrichis à travers search, the Video tab, Images, and Découvrir — requis vs. recommended properties, the two façons to ajouter clé moments (SeekToAction vs. Clip), and the BroadcastEvent LIVE badge.

Première publication : 1 juil. 2026 · Dernière mise à jour : 3 août 2026 · Advanced
Langues

VideoObject schema (schema.org/VideoObject) marks up une page's video so Google peut montrer video résultats enrichis — thumbnail, duration, and clé moments — à travers four surfaces, pas un: the principal résultats de recherche page, the Video tab, Google Images, and Google Découvrir. Que multi-surface reach is broader que la plupart personnes assume and rend ce un of the two highest-payoff rich-result types in the cluster (alongside Recipe). Seulement three properties are requis — nom, thumbnailUrl, and uploadDate — with contentUrl, description, duration, embedUrl, expires, interactionStatistic, and region eligibility tout recommended. Two fonctionnalités causer la plupart of the confusion. Clé moments (the chapter timestamps) peut be fait two façons: automatically via SeekToAction/potentialAction si votre video URLs déjà accept a timestamp parameter, or manually via Clip markup (nom, startOffset, and url are requis; endOffset is recommended) quand vous vouloir publisher-specified étiquettes and timestamps au lieu de Google's automatic picks. And the LIVE badge isn't a separate schema — it's BroadcastEvent (isLiveBroadcast, startDate, endDate — requis une fois you're ajout BroadcastEvent at tout) documented on the même page and utilisé alongside VideoObject. The la plupart courant miss is omitting uploadDate or writing it in an inconsistent date format. As toujours, valid markup seulement rend vous eligible — Google, and the video being crawlable, encore decide si it montre.

TL;DR — schema.org/VideoObject markup (usually JSON-LD) rend a video eligible pour video résultats enrichis à travers four Google surfaces — principal search, the Video tab, Google Images, and Google Découvrir. Requis: name, thumbnailUrl, uploadDate. Recommended: contentUrl, description, duration, embedUrl, expires, interactionStatistic, and regionsAllowed/ineligibleRegion. Clé moments have two mechanisms — automatic via SeekToAction/potentialAction (si votre URLs accept a timestamp parameter Google peut infer) or manual via Clip (name, startOffset, and url requis per chapter; endOffset recommended). The LIVE badge is BroadcastEvent (isLiveBroadcast, startDate, endDate) utilisé alongside VideoObject, documented on the même page — pas a separate system. The la plupart courant miss is omitting uploadDate or en utilisant an inconsistent date format. Valid markup seulement earns eligibility; Google encore decides si to montrer it, and the video has to be crawlable and indexable. Ce is un of the two highest-payoff types in the cluster alongside Recipe — worth doing correctement.

Evidence for this claim Schema.org VideoObject defines vocabulary for a video media object; being valid Schema.org does not by itself guarantee a Google video feature. Scope: Schema.org type definition, distinct from Google eligibility. Confidence: high · Verified: Schema.org: VideoObject Evidence for this claim Google's VideoObject documentation requires name, thumbnailUrl, and uploadDate for video structured-data eligibility and recommends additional properties. Scope: Current Google video structured data requirements; eligibility is not a display guarantee. Confidence: high · Verified: Google Search Central: Video structured data

Ce que VideoObject schema fait — un markup, four surfaces

La plupart guides flatten VideoObject into “get a thumbnail in search.” The reach is wider que que, and it’s worth leading with parce que it changements the ROI calculation. Google’s propre framing: “Videos peut apparaître in several différent places on Google, notamment the principal résultats de recherche page, Video mode, Google Images, and Google Découvrir.” That’s four distinct surfaces from un block of markup — qui is pourquoi I rank ce, with Recipe, as un of the two genuinely high-payoff types in the whole structured-data cluster. (It’s aucun coincidence the two overlap: nombreux Recipe pages embed a cooking video via the recipe’s video property, and que video is itself a VideoObject.)

The vocabulary is schema.org/VideoObject, and Google’s Video guide covers three connexe types on a unique page: VideoObject itself, Clip (clé moments), and BroadcastEvent (the LIVE badge). Worth knowing: là is aucun separate “media-clip” doc page — l’URL vous pourrait guess at renvoie a 404. Clip and segment markup pour video is folded into the même Video guide as VideoObject, so don’t go hunting pour a dedicated page que doesn’t exist.

Requis — the minimum pour quelconque video rich result:

PropertyCe que c’est
nameThe video’s title
thumbnailUrlURL to a representative thumbnail image
uploadDateThe date the video was premier publié (ISO 8601)

Recommended — ajouter as nombreux as appliquer; ils faire le résultat richer and plus reliable:

PropertyPourquoi c’est important
contentUrlDirect URL to the media fichier — helps Google récupérer the video
descriptionThe video’s description (plain text)
durationISO 8601 duration (e.g. PT4M12S) — powers the runtime badge
embedUrlURL to the player embed
expiresQuand the video is ne … plus disponible (omit si it doesn’t expire)
interactionStatisticView count via WatchAction interaction type
regionsAllowed / ineligibleRegionOù the video may / may pas be affiché

Provide soit contentUrl or embedUrl (les deux is meilleur) so Google has a façon to reach the réel video — a thumbnail with aucun reachable video is a courant raison a result jamais apparaît. The three URLs que come up ici ne sont pas interchangeable: contentUrl is the video file’s réel content bytes (Google’s propre docs appel it the la plupart effective façon pour Google to récupérer the video); embedUrl is the player, pas the fichier; and neither un is the watch page URL — lune page the video is embedded on. A courant mistake is pointing contentUrl at the watch page au lieu de the raw media fichier.

Evidence for this claim Google recommends contentUrl when available because it is the actual video bytes and most effective for fetching; embedUrl is the player URL alternative, not the watch page URL. Scope: web Confidence: high · Verified: Video structured data

Clé moments: SeekToAction vs. Clip

Clé moments are the chapter-style deep liens sous a video result que jump the viewer to a spécifique timestamp. Là are two mechanisms, and confusing les is the unique biggest source of implementation trouble on ce type.

1. Automatic — SeekToAction / potentialAction. Vous tell Google, via a potentialAction of type SeekToAction, l’URL pattern votre player uses to jump to a timestamp (the startOffset-input placeholder). Si votre video URLs déjà accept a timestamp parameter, Google peut infer the clé moments itself from votre on-page chapter structure. Utiliser ce quand votre Structure d’URL supports timestamps and you’re happy letting Google pick the moments.

{
  "@context": "https://schema.org",
  "@type": "VideoObject",
  "name": "How to tie a bowline knot",
  "thumbnailUrl": "https://example.com/thumbs/bowline.jpg",
  "uploadDate": "2026-05-01T08:00:00-05:00",
  "description": "A step-by-step guide to tying a bowline.",
  "duration": "PT4M12S",
  "contentUrl": "https://example.com/video/bowline.mp4",
  "embedUrl": "https://example.com/embed/bowline",
  "potentialAction": {
    "@type": "SeekToAction",
    "target": "https://example.com/watch/bowline?t={seek_to_second_number}",
    "startOffset-input": "required name=seek_to_second_number"
  }
}

2. Manual — Clip markup. Vous define chaque chapter explicitly as a Clip. Google’s Clip table splits ce the même façon as VideoObject itself: requisname, startOffset (in seconds), and a url que deep-links to que moment; recommendedendOffset (in seconds), so the clip has a défini fin as bien as a commencer. Utiliser ce quand vous vouloir to supply votre propre étiquettes and timestamps plutôt que the moments Google’s automatic detection voudrait sinon pick.

{
  "@context": "https://schema.org",
  "@type": "VideoObject",
  "name": "How to tie a bowline knot",
  "thumbnailUrl": "https://example.com/thumbs/bowline.jpg",
  "uploadDate": "2026-05-01T08:00:00-05:00",
  "hasPart": [
    {
      "@type": "Clip",
      "name": "Make the loop",
      "startOffset": 30,
      "endOffset": 75,
      "url": "https://example.com/watch/bowline?t=30"
    },
    {
      "@type": "Clip",
      "name": "Thread the tail",
      "startOffset": 75,
      "endOffset": 130,
      "url": "https://example.com/watch/bowline?t=75"
    }
  ]
}

Qui to utiliser? Automatic SeekToAction is moins fonctionner si votre URLs déjà prise en charge timestamp parameters and vous trust Google to pick the moments. Manual Clip is the correct appel quand vous vouloir to nom and bound chaque chapter yourself. Don’t stack les deux mechanisms pour the même objectif on the même video — pick un. The decision tree in the Resources groupe walks ce fork.

LIVE badges with BroadcastEvent

Pour livestreams, the red LIVE badge is enabled by ajout a BroadcastEvent to votre VideoObject via the publication property. It is pas a separate, unrelated schema type — it’s documented on the même Video guide and layered onto the VideoObject vous déjà have. BroadcastEvent as a whole isn’t requis pour a plain video rich result, but une fois vous ajouter it pour the LIVE badge, Google’s Clip-style table treats isLiveBroadcast, startDate, and endDate as requis ensemble:

  • isLiveBroadcast: true
  • startDate — quand the broadcast starts or is scheduled to commencer. A startDate in the future signals a scheduled broadcast; in the past or présent, it signals the stream has en réalité commencé.
  • endDate — quand it ends or is attendu to fin. Google is explicit que une fois the stream has en réalité finished, vous doit mettre à jour endDate to a réel valeur — an endDate in the future signals a scheduled fin, in the past or présent it signals the stream has ended. Si vous don’t know the fin temps up front, an approximate endDate is fine to commencer; simplement correct it une fois the stream en réalité wraps.

Nesting startDate/endDate ce façon lets Google infer three lifecycle states — scheduled, live, ended — from the même two fields, qui is aussi pourquoi a stale endDate (pas corrected après the stream arrête) is the principal façon a lingering LIVE badge se produit. None of ce guarantees the badge apparaît at quelconque particulier temps; it seulement supplies the timing Google’s systems utiliser to decide.

{
  "@context": "https://schema.org",
  "@type": "VideoObject",
  "name": "Launch livestream 2026",
  "thumbnailUrl": "https://example.com/thumbs/launch.jpg",
  "uploadDate": "2026-06-30T09:00:00-05:00",
  "publication": {
    "@type": "BroadcastEvent",
    "isLiveBroadcast": true,
    "startDate": "2026-07-01T14:00:00-05:00",
    "endDate": "2026-07-01T15:30:00-05:00"
  }
}

Vous aussi besoin to appel Google’s Indexation API pour livestream videos so the LIVE badge apparaît and disappears in a timely façon — the badge is time-sensitive in a façon a normal on-demand video isn’t.

Courant implementation mistakes

  • Omitting uploadDate or en utilisant a sloppy date format. It’s un of seulement three requis fields. Utiliser a consistent ISO 8601 valeur (a complet date-time with offset is safest). Ce is the unique la plupart courant miss on the type.
  • A thumbnail with aucun reachable video. Provide contentUrl and/or embedUrl so Google peut en réalité récupérer the video the thumbnail represents.
  • Marking up a video que Google can’t explorer or index. Données structurées can’t rescue a video hidden behind a login, blocked in robots.txt, or chargé in a façon the robot d’exploration can’t voir. Markup describes the video; it doesn’t faire it accessible.
  • Stacking les deux key-moment mechanisms. Pick automatic SeekToAction or manual Clip pour a donné video, pas les deux.
  • Forgetting to fermer out a livestream. Définir endDate and mettre à jour the markup une fois the stream ends, or the LIVE badge peut linger.
  • Treating valid markup as a guaranteed result. As with every rich-result type, valid VideoObject markup seulement rend lune page eligible — Google’s systems encore decide si to montrer it.

Où ce sits, and video SEO plus broadly

VideoObject is the structured-data couche pour video, and it lives ici alongside its siblings — Recipe (whose pages so souvent embed a cooking video) and Article (où a video is embedded à l’intérieur a written piece, and the VideoObject describes que embed). But the markup is seulement un slice of getting video to perform in search: hosting, sitemaps, thumbnails, transcripts, vitesse de page autour the player, and how vous embed tout matter aussi. Ceux broader video SEO topics sit outside ce structured-data article — ce page is deliberately scoped to the schema itself.

Pour où VideoObject fits in the wider structured-data picture, voir the Schema Markup and Données structurées hubs ce article nests sous.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.