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 reportA few more lines from the same documentation set the ground rules. Each is a direct quote:
- “Don't rely on user actions (such as swiping, clicking, or typing) to load the video.”
- “If you're using JavaScript to inject the video, make sure that it appears in the rendered HTML in the URL inspection tool.”
- “Don't use fragment identifiers to load the video, as Google Search doesn't generally support URL fragments.”
- “We support structured data, video sitemaps, and the Open Graph protocol (OGP).”
- “Google doesn't guarantee that adding markup will result in a specific video feature in Search results”
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.
- 1. Indexed watch pageThe page that embeds the video is indexed, canonical and not blocked by robots.txt,
noindexor 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.
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:
- Unique title and description. “Make sure each watch page has a page title and description that are unique to that video.”
- One page can't do both jobs. If you want a how-to article and a video result, publish the video on its own watch page (for example
https://example.com/videos/grill-steak/) and embed it in the article as well. Google says it is fine to include the same video on a watch page and on another page. - Text is allowed. A transcript, a short summary or chapter notes under the player help users and give the page indexable text. They do not turn the page into a non-watch page as long as the video stays the main purpose.
- Position matters. For pages that fail the watch page test, Search Console's advice includes: “Try moving the video container to a higher position in the HTML.” Put the player at the top of the main content, not below several screens of text.
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:
posterThe attribute on the HTML <video> element.
<video:thumbnail_loc>In a video sitemap (<media:thumbnail> in mRSS).
thumbnailUrlIn VideoObject structured data.
og:video:imageIn 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 rule | Google's specification |
|---|---|
| Formats | BMP, GIF, JPEG, PNG, WebP, SVG and AVIF |
| Size | Minimum 60×30 pixels, larger preferred |
| Location | Accessible 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.” |
| Uniqueness | One 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.
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
| Property | Status | What to put in it |
|---|---|---|
name | Required | The video title, unique for each video on the site |
thumbnailUrl | Required | One or more URLs of the video's unique thumbnail |
uploadDate | Required | When the video was first published, ISO 8601, ideally with a time zone |
contentUrl | Recommended | URL of the video file in a supported format |
embedUrl | Recommended | URL of the player for this video |
description | Recommended | Unique description; HTML tags are ignored |
duration | Recommended | ISO 8601 duration, such as PT1M54S |
creator (or author) | Recommended | Person or Organization with name and url |
expires | Recommended | Only if the video stops being available |
hasPart | Recommended | Nested Clip items for key moments |
interactionStatistic | Recommended | InteractionCounter with WatchAction, LikeAction, CommentAction or ShareAction |
regionsAllowed / ineligibleRegion | Recommended | ISO 3166-1 country codes; use one of the two, only if restricted |
publication | Recommended | Nested BroadcastEvent for livestreams and the LIVE badge |
<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>
Three rules make the difference between markup that helps and markup that confuses:
- Match the page. Title, description and thumbnail in the markup should be what users see on the watch page.
- Be unique. “Make sure to provide unique information in the thumbnailUrl, name, and description properties for each video on your site.”
- 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.”
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
- “The video must have the ability to deep link into some point other than the start point in the video URL.”
- “The total video duration must be a minimum of 30 seconds.”
- For
Clip: “Make sure that no two clips on the same video defined on the same page share a start time.” - The markup must be on a page where users can actually watch the video.
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>
- Required tags:
<video:video>,<video:thumbnail_loc>,<video:title>,<video:description>(up to 2048 characters) and either<video:content_loc>or<video:player_loc>. - content_loc or player_loc: “It's required to provide either a <video:content_loc> or <video:player_loc> tag.” Neither may be the same as
<loc>. For YouTube and Vimeo embeds use the player URL, for examplehttps://www.youtube.com/embed/…. - Useful optional tags:
duration(1 to 28800 seconds),expiration_date,publication_date,family_friendly,restriction,platform,requires_subscription,uploader,liveand up to 32tagelements. - Deprecated:
<video:category>,<video:gallery_loc>,<video:price>and<video:tvshow>were removed from Google's documentation. Plugins that still output them do no good. - Relevance: “Don't list videos that are unrelated to the content of the host page.”
- Access: every URL in the sitemap must be reachable by Googlebot: not blocked by robots.txt, a login or a firewall, and served over HTTP or FTP (streaming protocols are not supported).
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:
- Video indexed — the page and one video on it were indexed.
- No video indexed — Google saw at least one video but could not index any of them. The report then gives a reason.
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.
| Reason in the report | What it means | What to do |
|---|---|---|
| Video isn't on a watch page | The video looks supplementary to the page's text or is one of several videos | Give it a dedicated watch page; move the player higher in the HTML; check it is in the rendered HTML |
| Cannot determine video position and size | The player is not on the page at load time, often an image that must be clicked | Load the real player at its actual size and position on page load, with no click |
| MRSS failure; try using schema.org instead | Google could not process the mRSS description | Describe the video with VideoObject markup |
| No thumbnail URL provided | No thumbnail given, and Google could not generate one | Add one in markup or a sitemap; make sure no other tag declares a different one |
| Unsupported thumbnail format | The file extension is not a supported image format | Use a supported format with the right extension |
| Invalid thumbnail size | The thumbnail is too small or otherwise not a supported size | Provide a larger thumbnail (at least 60×30) |
| Thumbnail blocked by robots.txt | A robots.txt rule blocks the image, possibly on another host | Unblock it, or ask the host's owner to |
| Thumbnail is transparent | Too much of the image is transparent | Use an opaque image |
| Thumbnail could not be crawled due to hostload | Your server is at its crawl capacity, as Google estimates it | Add server capacity; reduce wasted crawling |
| Thumbnail could not be reached | Login, password, 404 or a URL that no longer exists | Serve the thumbnail publicly at a stable URL |
| Video not processed | Google found the video but decided not to index it | Check stable URLs and fetchable files |
| Video not processed yet | Processing is still running | Check back in a few days |
| Video not found on host service | The video is missing, private or unreachable on its host | Fix the video ID or URL, or the host's privacy setting |
| Invalid thumbnail | Any other thumbnail problem | Recheck the thumbnail against every rule above |
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 result | Your watch page | Your page, the platform's page, or both; the platform page often wins |
| File and thumbnail URLs | You decide; you can keep them stable | Set by the platform |
| Markup | contentUrl and embedUrl | Usually embedUrl only |
| Key moments | Clip or SeekToAction | Timestamps in the YouTube description, or Clip on your page |
| Audience | Only through your site | Plus the platform's own search and recommendations |
| Cost and work | Hosting, bandwidth, encoding, player | Free 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
- Remove a video for good: return 404 or add
noindexon the watch page. For speed, also file a removal request for that page. Other pages that embed the same video need their own removal. - Expiring content: set
expiresin markup or<video:expiration_date>in the sitemap. “When a video has an expiration date in the past, the video won't appear in video results.” Do not add a date to videos that do not expire. A wrong past date silently removes a live video. - Countries:
regionsAllowedorineligibleRegionin markup, or<video:restriction relationship="allow">/"deny"in the sitemap. Leave them out if there is no restriction. - Hide the video, keep the page: send a
noindexon the requests for the video file and its thumbnail. Just refusing to serve the bytes is not enough: “Simply not returning video bytes for a crawling request won't prevent a video from appearing in Search, since Google can index a video even without a successful fetch of the video file.”
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.
Common mistakes
- ✕Video only in a pop-up or lightboxThe page shows a picture with a play icon and the player opens in a modal. Google cannot see the video's position on the page.
- ✕Video below the fold or in a closed tabOn a watch page the player belongs at the top of the main content.
- ✕Lazy players with no thumbnailA facade with no
poster, no markup and no player until a click gives Google nothing to index. - ✕Expiring CDN URLsSigned thumbnail or file URLs that change every few hours break indexing, key moments and previews.
- ✕Watch page URL in contentUrl
contentUrlis the file,embedUrlthe player, the page is neither. - ✕Several equal videos on one pageThat is a category page. Google indexes one video per page at most.
- ✕Different metadata in different placesOne thumbnail in the markup, another in
poster, a third in the sitemap. - ✕Thumbnail or file blocked in robots.txtOften a blanket rule on
/wp-content/uploads/or the CDN host. - ✕A past expires date on a live videoA copied template date removes the video from video results.
- ✕Markup on a page with no videoKey moments and
VideoObjectmust sit on a page where users can watch the video.
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
- Google Search Central — Video SEO best practices
- Google Search Central — Video (VideoObject, Clip, BroadcastEvent) structured data
- Google Search Central — Video sitemaps and alternatives
- Search Console Help — Video indexing report
Quotes checked against the official pages on 30 October 2026.