Audit my site
On-pageIntermediateChecked against Google docs · Oct 2026

Video SEO: getting videos indexed and shown in Google

Google indexes a video only from an indexed watch page that shows the player without a click and has a stable thumbnail. Markup, key moments and a video sitemap add the details; the Video indexing report tells you what went wrong.

Author: Eugene Serbin, Head of SEO at Semalt Updated: 30 October 2026 Reading time: 22 min Visuals: 5

In short

Video SEO starts with the page, not the file: Google indexes a video only from an indexed watch page whose main purpose is that one video. The player has to be in the rendered HTML without a click, with a valid thumbnail and stable URLs for the thumbnail and the file. VideoObject structured data, key moments markup and a video sitemap then tell Google the details, and the Video indexing report in Search Console shows which videos made it and why the rest did not.

Where videos appear in Google

Google lists the places in one sentence: “Videos can appear in several different places on Google, including the main search results page, Video mode, Google Images, and Discover”. In the main results a video can show as a video result with a thumbnail, a duration and sometimes key moments. In Video mode the whole results page is videos.

There is an important middle ground. A page where the video is only part of the content can still show up, just not as a full video result. Google says “a non-watch page can still be eligible to appear as a text result and Google Image result with a video badge.” Full video features need a watch page.

Keep the order of operations in mind for the rest of this lesson. Page indexing comes first, video indexing second. If the page is not indexed, nothing about the video matters. If the page is indexed, the video still has to pass its own checks. The general page side is covered in the lessons Page indexing report: every status and JavaScript SEO and rendering; this lesson covers the video layer on top.

What Google officially says

“The watch page must be indexed.”

Google Search Central — Video SEO best practices

“Just because the watch page is indexed doesn't mean that the video will also be indexed.”

Google Search Central — Video SEO best practices. Google adds: “The indexed watch page must be performing well in Search before its video can be considered for indexing.”

“Google indexes only one video per page.”

Search Console Help — Video indexing report

A few more lines from the same documentation set the ground rules. Each is a direct quote:

What Google needs to index a video

Google's indexing requirements are short, but each one is a common point of failure. Put together with the discovery rules, this is the full list a video has to pass.

Checklist · Before Google can index a video
  • 1. Indexed watch pageThe page that embeds the video is indexed, canonical and not blocked by robots.txt, noindex or a login.
  • 2. The video is the point of the pageOne main video per page, near the top of the main content, not a side element.
  • 3. A supported elementThe player sits in a <video>, <embed>, <iframe> or <object> element.
  • 4. In the rendered HTML, without a clickNo user action, no URL fragment, no player that only exists after a click.
  • 5. Not hiddenThe video is not covered by other elements, tucked into a closed tab or available only in a pop-up.
  • 6. A supported file typeMP4, WebM, MOV, M3U8 and the other listed formats. Data URLs are not supported.
  • 7. A valid thumbnail at a stable URLFetchable by Googlebot, in a supported format, not mostly transparent.
  • 8. Stable, fetchable video filesNeeded for key moments and previews; both servers have capacity for crawling.
Items 1, 2, 5 and 7 are Google's indexing requirements; the others are its discovery and feature rules.

Embedding and discovery

Google finds videos in four HTML elements: <video>, <embed>, <iframe> and <object>. JavaScript players are fine as long as the element appears in the rendered HTML; check that in URL Inspection rather than assuming. If you load media through an API such as Media Source Extensions, Google asks that the video container is still injected even if the API call fails, so it can locate the video's position.

Supported file types

Google lists them all: “3GP, 3G2, ASF, AVI, DivX, M2V, M3U, M3U8, M4V, MKV, MOV, MP4, MPEG, OGV, QVT, RAM, RM, VOB, WebM, WMV, and XAP.” and “Data URLs aren't supported.” In practice almost every site uses MP4, WebM or an HLS playlist (.m3u8).

Stable URLs

This is the requirement that breaks most often on modern stacks. “Some CDNs use quickly expiring URLs. If the video's thumbnail URL changes too often, Google may not be able to successfully index your videos.” Google's fix is to “use a single unique and stable thumbnail URL for each video.” The video file needs a stable URL too if you want key moments and previews. If you worry about people scraping your files, Google allows you to serve the stable contentUrl only to verified Googlebot.

Fetchable files and server capacity

“Google needs to successfully fetch the actual bytes of a video file to enable features like video previews and key moments.” So do not block the file URL in robots.txt or with noindex. If the watch page is on example.com and the stream comes from stream.example.com, both hosts need to meet Google's technical requirements and both need spare capacity for crawling.

Watch pages: what counts and what does not

The watch page is the central idea of video SEO. Google's definition: a watch page's “main purpose is to show users a single video.” The test is simple: is watching this one video the main reason someone opens the page?

✓ Watch pages

  • A video landing page
  • A TV episode video player page
  • A news video watch page
  • A sports highlight page
  • An events clip page

✕ Not watch pages

  • A blog post that reviews an embedded video
  • A product page with a 360 video of a product
  • A video category page that lists multiple videos of equal prominence
  • A movie review page with an embedded movie trailer

Both lists are Google's own examples. A few rules follow from them:

Thumbnails

No thumbnail, no video result. “If you allow Google to fetch your video files, Google will try to automatically generate a thumbnail for you.” You can choose your own through any of four sources:

poster

The attribute on the HTML <video> element.

<video:thumbnail_loc>

In a video sitemap (<media:thumbnail> in mRSS).

thumbnailUrl

In VideoObject structured data.

og:video:image

In Open Graph tags.

If you use more than one source, Google asks you to “make sure you're using the same thumbnail URL per video across all metadata.” Mismatches are a documented cause of indexing problems.

Thumbnail ruleGoogle's specification
FormatsBMP, GIF, JPEG, PNG, WebP, SVG and AVIF
SizeMinimum 60×30 pixels, larger preferred
LocationAccessible to Googlebot and Googlebot Images: not blocked by robots.txt or a login, at a stable URL
Transparency“At least 80% of the thumbnail's pixels must have an alpha (transparency) value greater than 250.”
UniquenessOne unique thumbnail per video; do not reuse the same image for different videos

In practice, use a 16:9 JPEG or WebP frame that shows what the video is about, at a size that still looks sharp in a large result, served from your own domain at a URL that never changes.

VideoObject structured data

VideoObject is how you tell Google the facts about a video: its title, thumbnail, date, duration and where the file and player live. Google warns: “If you don't include the required properties, Google may not be able to extract any information about the video.” Markup does not replace the indexing requirements above; it describes a video that already meets them. The general rules for markup are in the lesson Structured data in 2026.

Which URL is which

A video has three URLs, and mixing them up is the most common markup error.

Diagram · The three URLs of one video
Watch page, player and file URLs and where each one goes The watch page URL goes in the sitemap loc tag. The player URL goes in embedUrl and video:player_loc. The video file URL goes in contentUrl and video:content_loc. None of the three may be the same as another. 1. Watch page2. Video player3. Video file The page people visitUsually the iframe srcThe actual video bytes example.com/videos/steak/example.com/player?v=123cdn.example.com/123.mp4 SITEMAPSTRUCTURED DATASTRUCTURED DATA STRUCTURED DATASITEMAPSITEMAP <loc>embedUrlcontentUrl (the page itself)<video:player_loc><video:content_loc>
Example URLs are illustrative. The watch page URL never goes into contentUrl or embedUrl.

Google is explicit about contentUrl: “Don't link to the page where the video lives; this must be the URL of the video file's actual content bytes itself.” It also says contentUrl is “the most effective way for Google to fetch your video content files. If contentUrl isn't available, provide embedUrl as an alternative.” With a YouTube or Vimeo embed you usually have only the player URL, so you use embedUrl.

Required and recommended properties

PropertyStatusWhat to put in it
nameRequiredThe video title, unique for each video on the site
thumbnailUrlRequiredOne or more URLs of the video's unique thumbnail
uploadDateRequiredWhen the video was first published, ISO 8601, ideally with a time zone
contentUrlRecommendedURL of the video file in a supported format
embedUrlRecommendedURL of the player for this video
descriptionRecommendedUnique description; HTML tags are ignored
durationRecommendedISO 8601 duration, such as PT1M54S
creator (or author)RecommendedPerson or Organization with name and url
expiresRecommendedOnly if the video stops being available
hasPartRecommendedNested Clip items for key moments
interactionStatisticRecommendedInteractionCounter with WatchAction, LikeAction, CommentAction or ShareAction
regionsAllowed / ineligibleRegionRecommendedISO 3166-1 country codes; use one of the two, only if restricted
publicationRecommendedNested BroadcastEvent for livestreams and the LIVE badge
Code · A complete VideoObject in JSON-LD
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "VideoObject",
  "name": "How to grill a steak: 5 steps",
  "thumbnailUrl": [
    "https://example.com/thumbs/grill-steak-16x9.jpg",
    "https://example.com/thumbs/grill-steak-4x3.jpg"
  ],
  "uploadDate": "2026-10-01T09:00:00+01:00",
  "description": "Chef Ana shows how to season, sear and rest a ribeye.",
  "duration": "PT6M12S",
  "contentUrl": "https://cdn.example.com/video/123/grill-steak.mp4",
  "embedUrl": "https://example.com/player?video=123",
  "creator": {
    "@type": "Organization",
    "name": "Example Kitchen",
    "url": "https://example.com/"
  },
  "interactionStatistic": {
    "@type": "InteractionCounter",
    "interactionType": { "@type": "WatchAction" },
    "userInteractionCount": 12345
  },
  "hasPart": [{
    "@type": "Clip",
    "name": "Season the steak",
    "startOffset": 35,
    "endOffset": 90,
    "url": "https://example.com/videos/grill-steak/?t=35"
  }]
}
</script>
Highlighted keys are the three required properties; everything else is recommended. Values are illustrative.

Three rules make the difference between markup that helps and markup that confuses:

  1. Match the page. Title, description and thumbnail in the markup should be what users see on the watch page.
  2. Be unique. “Make sure to provide unique information in the thumbnailUrl, name, and description properties for each video on your site.”
  3. Be consistent across sources. The same video and thumbnail URLs in structured data, the sitemap, Open Graph and the HTML player. Search Console warns that when it sees several URLs for one video, it may combine metadata from all of them.

Validate with the Rich Results Test, then watch the Video rich result report in Search Console after release.

Key moments: Clip, SeekToAction and YouTube chapters

Key moments are the labelled jump links under a video result. “Google Search tries to automatically detect the segments in your video and show key moments to users, without any effort on your part.” You can take control: “We will prioritize key moments set by you, either through structured data or the YouTube description.”

Diagram · Three ways to tell Google about key moments
How Clip, SeekToAction and YouTube timestamps become key moments Clip markup gives each label and start time. SeekToAction gives the URL pattern for timestamps so Google can find moments itself. A YouTube description gives timestamps and labels. Without any of them Google may detect segments automatically. All four lead to key moments under a video result; clicking one opens the watch page at that second. Clip markupSeekToAction markupYouTube description No markup You set each label and start time You give the ?t= URL pattern Timestamps and labels, one per line Google may detect segments itself How to grill a steak example.com › videos Video · 6:12 KEY MOMENTS 0:351:304:05 Season itSear both sidesRest and slice opens …/videos/grill-steak/?t=35
Labels and times are illustrative. Whichever source you use, each moment links to the watch page at that second.

Clip markup

With Clip you “Specify the exact start and end time to each segment, and what label to display for each segment.” It works in every language Google Search supports. Each Clip needs name, startOffset (seconds from the start) and url; endOffset is recommended. The clip URL has to be the same URL path as the video with a time parameter added, such as ?t=35. Use Clip when you want to choose the moments and their labels yourself.

SeekToAction markup

With SeekToAction you “Tell Google where timestamps typically go in your URL structure, so that Google can automatically identify key moments and link users to those points within the video.” Google picks the moments; you only show it how to deep link. It is supported in English, Spanish, Portuguese, Italian, Chinese, French, Japanese, German, Turkish, Korean, Dutch and Russian. The markup is a potentialAction inside VideoObject:

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

This fits platforms with thousands of videos where nobody will write labels by hand. Google must be able to fetch the video files for SeekToAction to work.

Rules for both

YouTube timestamps and chapters

For videos hosted on YouTube, the timestamps in the YouTube description do the job, in all languages. Google's formatting rules: the format is [hour]:[minute]:[second] (the hour can be left out), the label sits on the same line as its timestamp, “Place each timestamp on a new line in the video description.”, “Make sure the label contains at least one word.” and “List the timestamps in chronological order.” YouTube's own Video Chapters feature has some extra guidelines of its own.

Opting out, and video previews

To switch key moments off completely, including automatic ones, use the nosnippet robots meta tag. Remember that nosnippet also removes text snippets for the page. A related feature is the moving preview: “Google selects a few seconds from your video to display a moving preview”. It needs Google to fetch the file, and you can cap its length with the max-video-preview robots meta tag.

The LIVE badge for livestreams

The LIVE badge is documented and works through markup: “For livestreaming videos, you can enable a red "LIVE" badge to appear in search results by using BroadcastEvent structured data.” Google adds that “The LIVE badge can be applied to any public video that is live-streamed for any length of time.”

Nest a BroadcastEvent in the publication property of VideoObject with three properties: isLiveBroadcast set to true, startDate and endDate. Provide an approximate endDate if you do not know it yet, and the real one once the stream ends. To get the timing right, “To make sure Google crawls your livestream video at the right time, use the Indexing API.” Call it when the stream goes live, when it ends and the markup has been updated, and whenever the markup changes. “The Indexing API only supports livestream videos.”, so do not use it for ordinary uploads.

Video sitemaps and mRSS

A video sitemap is a normal XML sitemap with extra video: tags. It helps Google find videos it might miss while crawling and gives it the details in one place. “Google recommends using video sitemaps, however we also support mRSS feeds.” You can add the tags to your existing sitemap or keep a separate one; the general rules from the lesson XML sitemaps still apply.

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
  <url>
    <loc>https://example.com/videos/grill-steak/</loc>
    <video:video>
      <video:thumbnail_loc>https://example.com/thumbs/grill-steak-16x9.jpg</video:thumbnail_loc>
      <video:title>How to grill a steak: 5 steps</video:title>
      <video:description>Chef Ana shows how to season, sear and rest a ribeye.</video:description>
      <video:content_loc>https://cdn.example.com/video/123/grill-steak.mp4</video:content_loc>
      <video:duration>372</video:duration>
    </video:video>
  </url>
</urlset>

A sitemap and structured data do not compete. Use the sitemap for discovery across the whole library and the markup on each watch page for the details and features. Keep the values identical in both.

The Video indexing report in Search Console

The report lives under Indexing → Videos. Two facts shape how you read it. First, “The report covers only indexed pages.” A watch page that is not indexed is not in it at all; look for it in the Page indexing report. Second, it counts pages, not videos: “Search Console currently doesn't have a report showing the total number of unique indexed videos on a site”.

Every indexed page where Google found a video has one of two statuses:

Add the two numbers together. The sum should roughly equal the number of pages with videos on your site. A sum that is much lower means a page-level problem (watch pages not indexed, or no video detected on them). A high No video indexed count means a video-level problem.

Table · Video indexing reasons and how to fix them
Reason in the reportWhat it meansWhat to do
Video isn't on a watch pageThe video looks supplementary to the page's text or is one of several videosGive it a dedicated watch page; move the player higher in the HTML; check it is in the rendered HTML
Cannot determine video position and sizeThe player is not on the page at load time, often an image that must be clickedLoad the real player at its actual size and position on page load, with no click
MRSS failure; try using schema.org insteadGoogle could not process the mRSS descriptionDescribe the video with VideoObject markup
No thumbnail URL providedNo thumbnail given, and Google could not generate oneAdd one in markup or a sitemap; make sure no other tag declares a different one
Unsupported thumbnail formatThe file extension is not a supported image formatUse a supported format with the right extension
Invalid thumbnail sizeThe thumbnail is too small or otherwise not a supported sizeProvide a larger thumbnail (at least 60×30)
Thumbnail blocked by robots.txtA robots.txt rule blocks the image, possibly on another hostUnblock it, or ask the host's owner to
Thumbnail is transparentToo much of the image is transparentUse an opaque image
Thumbnail could not be crawled due to hostloadYour server is at its crawl capacity, as Google estimates itAdd server capacity; reduce wasted crawling
Thumbnail could not be reachedLogin, password, 404 or a URL that no longer existsServe the thumbnail publicly at a stable URL
Video not processedGoogle found the video but decided not to index itCheck stable URLs and fetchable files
Video not processed yetProcessing is still runningCheck back in a few days
Video not found on host serviceThe video is missing, private or unreachable on its hostFix the video ID or URL, or the host's privacy setting
Invalid thumbnailAny other thumbnail problemRecheck the thumbnail against every rule above
Reason names as shown in Search Console; descriptions and fixes summarised from Search Console Help.

To check one page, use URL Inspection. If Google found a video, the result has a Video indexing section with the video URL, the thumbnail URL and whether the page counts as a watch page. If that section is missing, Google found no video at all: look at the rendered HTML and the screenshot. After a fix, use Validate fix in the report. To track results, filter the Performance report by the Videos search appearance, or switch the search type to Video.

Self-hosted video vs YouTube and other embeds

Google treats both setups as valid. For third-party players, it says “Google may index the video both on your web page and on the third-party platform's equivalent page.” What changes is how much you control.

Self-hosted (or your own video CDN)YouTube, Vimeo and similar embeds
Who gets the resultYour watch pageYour page, the platform's page, or both; the platform page often wins
File and thumbnail URLsYou decide; you can keep them stableSet by the platform
MarkupcontentUrl and embedUrlUsually embedUrl only
Key momentsClip or SeekToActionTimestamps in the YouTube description, or Clip on your page
AudienceOnly through your sitePlus the platform's own search and recommendations
Cost and workHosting, bandwidth, encoding, playerFree hosting; heavier embed script on your page

A sensible pattern for many sites: publish on YouTube for reach, and also give each important video its own watch page on your site with VideoObject markup and the YouTube player URL as embedUrl. If clicks to your own site are the goal, self-host the videos that matter most. For more features, Google suggests you “check with your video host to ensure they allow Google to fetch your video file.”

"Lite" or facade embeds load a static image and swap in the real player only on click. They are good for speed, but the player does not exist until a user acts, which is exactly what produces Cannot determine video position and size. On watch pages, keep the real player element in the HTML at its real size and defer the heavy scripts instead.

Removing, expiring and restricting videos

Check the pages that carry your videos

OurSEO Tools crawls up to 1,000 pages and records the status code, canonical, indexability and load time of every URL, so you can confirm your watch pages are indexable before you work on the video layer.

69-point checklistTechnical crawlContent analysis

Common mistakes

FAQ

Do I need a video sitemap if I already use VideoObject markup?

Not strictly. Google supports both and either can describe a video. A sitemap helps Google find videos across a large library and new uploads; markup gives the details on each page. Many sites use both with identical values.

Can a page with several videos get video results?

Google indexes at most one video per page, and a page listing several videos of equal prominence is not a watch page. Give each important video its own watch page and link to them from the listing page.

If I embed a YouTube video, whose page ranks?

Google may index the video on both your page and the YouTube page, and both can appear. Your page needs to be a real watch page with markup to compete. The YouTube page often wins for the same video.

Why is the page indexed but the video is not?

Because video indexing is a separate step. The page must be a watch page, perform well in Search, show the player without a click and have a valid thumbnail. Open the Video indexing report for the exact reason.

How do I get key moments for my video?

Add Clip markup with labels and start times, or SeekToAction so Google can pick moments itself. For YouTube videos, add timestamps to the description. The video must be at least 30 seconds long and support deep links to a time.

Can I use the Indexing API to get regular videos indexed faster?

No. Google states that the Indexing API only supports livestream videos. Use a video sitemap and good internal links for normal uploads.

Sources

Quotes checked against the official pages on 30 October 2026.