Does your video have captions?
Enter the page your product demo, homepage hero, course lesson or podcast episode is on. We list every player on it with what it actually carries — then name the ones with sound and no caption track, and the ones that start talking before anybody asked.
Free, instant, no signup and no card. Nothing is stored.
Free, instant, no signup and no card. Point it at the page the video is actually on — a product demo, a homepage hero, a podcast episode, a course lesson. We read the HTML your server sends for that one page. Nothing is stored.
The one accessibility artefact nobody ships by accident
Most accessibility defects are cheap to fix once you know they are there. Alt text is a sentence. A form label is an attribute. A heading is a tag. A caption track is different: it is a separate timed file, per video, that somebody has to sit down and make. Which is why it is the criterion a site fails almost by default, and why the failure is so quiet — a <video src="demo.mp4" controls> with no <track> inside it is complete, valid HTML. No linter warns. No framework warns. No build step fails. The page looks finished, because in every sense except the one that matters to a deaf visitor, it is.
We ran this checker over public pages while building it. The one that says the most: W3Schools’ own tutorial page for the <video> element — the page millions of developers learn the tag from — serves two unmuted videos with zero caption tracks between them. That is not a criticism of a tutorial, it is the shape of the problem. The canonical example of how to embed a video does not include a caption track, so neither does the code copied from it.
The second thing this finds is louder and simpler. Audio that starts on its own, unmuted, with no controls is a level A failure under SC 1.4.2 — and it is the single defect a screen reader user cannot work around, because the way they would find your stop button is by listening to the page, and your audio is what they cannot hear over.
What this checker refuses to call a failure
Media is the category where a captions checker cries wolf loudest, because the most common <video> on the marketing web is the muted hero loop — and it has no audio to caption. A tool that counts <track> elements reports every one of those as a level A violation, and an owner who checks the first two and finds them wrong never reads the third. So four things are called failures here. Everything else is reported, argued, and kept out of the count.
A muted video is never a captions failure. Read live while building this, Apple’s homepage served two muted product videos and Notion’s served one: correct markup, nothing owed under SC 1.2.2, and all three are listed here under the question that does apply to them — whether a silent video that shows you something needs a text alternative, and whether a loop that never stops needs a pause control.
A hosted embed is never guessed at. A YouTube, Vimeo, Wistia or Loom player keeps its track list behind its own API, so nothing in your HTML can say whether it is captioned. It is listed with the two-click way to check it by hand. What we can read — whether the iframe has an accessible name — is read, and an unnamed player is a real SC 4.1.2 failure.
kind="subtitles" is review, not a failure. The distinction from captions is real under WCAG, and the attribute cannot prove which one your file contains — it is the HTML default, and plenty of fully captioned videos ship with it. Same for a missing controls attribute, which usually means a custom player rather than an uncontrollable one, and for a missing audio description, which SC 1.2.3 lets you satisfy with a transcript instead.
Video with sound and no caption track
FailsWCAG 2.1 SC 1.2.2 Captions (Prerecorded) (Level A)
This <video> carries audio — it is not muted, or it offers controls, or it loops with sound — and there is no <track kind="captions"> inside it. Everything said in it is unavailable to anyone who is deaf or hard of hearing, and to the much larger group watching with the sound off. Nothing in the markup is malformed, which is why this survives every review the page gets: a <video> tag with no <track> is complete, valid HTML.
Caption track that names no file
FailsWCAG 2.1 SC 1.2.2 Captions (Prerecorded) (Level A)
A <track> element is there and its src is missing or empty, so the browser has nothing to fetch and the captions menu is either absent or empty. This is worse than having no track at all: every automated check that only counts <track> elements scores the page as captioned, and the defect can sit for years behind a green tick.
Audio starts by itself with no way to stop it
FailsWCAG 2.1 SC 1.4.2 Audio Control (Level A)
This element has autoplay, is not muted, and offers no controls. If it runs for more than three seconds, that is a level A failure outright. It is also the one accessibility defect a screen reader user cannot work around: their synthesised speech is now competing with your audio, and the way they would normally find your stop button — listening to the page — is the thing your audio is drowning out.
Embedded player with no accessible name
FailsWCAG 2.1 SC 4.1.2 Name, Role, Value (Level A)
An <iframe> carrying a video player with no title attribute and no aria-label. Screen readers list a page's frames the way they list its links, and this one is announced as "frame" or by its URL — so a reader arrowing through the page meets an unnamed region containing a focusable player, with nothing to say what is in it. A page with two unnamed embeds gives them no way to tell the product demo from the testimonial.
Text track declared as subtitles, not captions
ReviewWCAG 2.1 SC 1.2.2 Captions (Prerecorded) (Level A)
The only text track on this video says kind="subtitles". Not a failure, and worth knowing: under WCAG the difference is real. Subtitles assume you can hear and translate the dialogue; captions are for someone who cannot hear and must also carry the non-speech audio — who is speaking, the phone ringing, the laugh that makes the next line land. The markup cannot prove which one your file contains, and kind="subtitles" is the WebVTT default that plenty of fully captioned videos ship with, which is why this is review.
Looping video that starts itself and offers no pause
ReviewWCAG 2.1 SC 2.2.2 Pause, Stop, Hide (Level A)
A muted autoplay loop — the hero-section background pattern. There is no audio to caption, so SC 1.2.2 does not reach it, but SC 2.2.2 does: moving content that starts automatically and runs for more than five seconds must have a way to pause, stop or hide it. A loop runs forever. For a reader with a vestibular disorder, and for anyone whose attention the movement takes and does not give back, the page has no off switch.
Audio with no transcript link on the page
ReviewWCAG 2.1 SC 1.2.1 Audio-only (Prerecorded) (Level A)
An <audio> element — a podcast episode, a recorded call, a pronunciation clip — and no link on this page whose text reads like a transcript. Prerecorded audio-only content needs a text alternative that presents the same information. It is review because your transcript may be on another page, inside a collapsed panel, or rendered after this HTML is served, and a checker that reads markup cannot see any of those.
Text track with no language declared
ReviewWCAG 2.1 SC 1.2.2 (advisory)
A <track> with no srclang. HTML requires it for subtitles, and players use it to build the captions menu and to label the track; without it the menu entry reads "Unknown" and a screen reader has no idea which voice to read the cue text in. The captions still display, which is why this is review and not a failure.
Media element with no controls attribute
ReviewWCAG 2.1 SC 2.1.1 Keyboard (Level A)
This element has no controls attribute, so the browser renders no play button, no scrubber and no volume. That is often correct — it usually means a custom player built in JavaScript is drawing its own. It is review rather than a failure because this check reads markup and cannot see that player. What it can tell you is where to look: if the custom controls are <div>s with click handlers, a keyboard cannot reach them, and the video cannot be played at all without a mouse.
Captioned video with no described track
ReviewWCAG 2.1 SC 1.2.3 / 1.2.5 Audio Description (Level A / AA)
This video has captions — so the audio reaches a deaf visitor — and there is no <track kind="descriptions"> and no obvious text alternative for what is only shown on screen. If the video demonstrates something silently (a cursor moving through your product, a number appearing in a chart), a blind visitor gets narration that says "as you can see here" about something they cannot. Review, not a failure, because SC 1.2.3 can also be met with a text alternative elsewhere on the page, and many sites do exactly that.
Hosted player — captions can't be read from here
VerifyA YouTube, Vimeo, Wistia or Loom embed. Whether it has captions is decided inside the player, by the track list its API serves, and nothing in the HTML your server sends can say either way. It is listed here rather than guessed at because the guess would be wrong in both directions: plenty of embeds are fully captioned, and plenty of channels are relying on YouTube's automatic captions, which WCAG does not accept as captions at all — they are unreviewed machine output, and the criterion asks for an accurate synchronised alternative.
Silent decorative video (muted, no controls)
VerifyMuted, no controls, and not looping — the decorative or poster-style video. It has no audio to caption, so SC 1.2.2 does not apply and this is not a violation. It is listed because it is where a real failure hides: a muted autoplaying "background" video that actually SHOWS something — a workflow, a set of numbers, a demo — is video-only content carrying information, and SC 1.2.1 asks for a text alternative that presents the same thing.
The fix, in full
Before — valid HTML, no warning anywhere, and unusable without sound:
<video src="/media/demo.mp4" autoplay loop></video>
After:
<video controls poster="/media/demo.jpg">
<source src="/media/demo.mp4" type="video/mp4">
<track kind="captions"
src="/media/demo.en.vtt"
srclang="en"
label="English"
default>
</video>
<p><a href="/media/demo-transcript">Read the transcript</a></p>Four changes, and each one answers a criterion. controls instead of autoplay loop answers SC 1.4.2 and SC 2.2.2 at once — nothing starts by itself, and the browser’s own player is keyboard accessible for free. The <track> answers SC 1.2.2. The transcript link answers SC 1.2.3 for a product video whose narration already describes what is on screen, and it is the cheapest indexable text you will ever add to the page — an eight-minute demo is a thousand words that currently do not exist for a crawler either.
The .vtt file itself is plain text: a timestamp line and the words spoken between those times. Generate the first pass automatically, then read it once against the audio and fix the names, the product terms and the numbers — the words machine captioning gets wrong are precisely the ones carrying the meaning, which is why WCAG does not accept auto-captions as captions.
Common questions
- What does a video accessibility checker check?
- Whether the video on your page can be used by someone who cannot hear it, and whether anything on the page starts talking without being asked. It reads every <video>, <audio> and known player <iframe> the page serves and answers four questions about each: is there a caption track, does that track name a file, does audio start on its own with no way to stop it, and does an embedded player have a name. Each failure is named under the WCAG 2.1 criterion it sits on — SC 1.2.2 Captions at level A, SC 1.4.2 Audio Control at level A, SC 4.1.2 Name Role Value at level A.
- Why do captions get missed when alt text doesn't?
- Because a caption track has to be authored. Alt text is a sentence someone types into a CMS field; a header cell is a tag swap; a form label is an attribute. A caption file is a separate timed document per video, and nobody produces one by accident. Meanwhile the markup gives no hint that it is missing: <video src="demo.mp4" controls> is complete, valid HTML that no linter, no framework and no build step will ever warn about. The page looks finished because it is finished, in every sense except the one that matters to a deaf visitor.
- My video is a silent background loop. Do I need captions?
- No, and this checker will not tell you that you do. A muted <video> has no audible track by definition, so SC 1.2.2 does not reach it. What does reach it is SC 2.2.2 Pause, Stop, Hide: moving content that starts automatically and runs more than five seconds needs a way to pause, stop or hide it, and a loop runs forever. So a muted autoplay loop is reported here for review under that criterion, never as a captions failure. And if the silent video actually SHOWS something — a workflow, a number, a demo — then it is video-only content carrying information, and SC 1.2.1 asks for a text alternative.
- Can you tell whether my YouTube embed has captions?
- No, and no tool reading your HTML can. The track list lives inside the player, behind YouTube's own API, so the only honest answer is to list the embed and tell you where to look. Guessing would be wrong in both directions: plenty of embeds are fully captioned, and plenty of channels are relying on YouTube's automatic captions — which WCAG does not accept, because they are unreviewed machine output and the criterion asks for an accurate synchronised alternative. What we can read about that iframe is whether it has an accessible name, and that is a real level A failure when it is missing.
- Are subtitles the same as captions?
- Not under WCAG. Subtitles assume you can hear and are translating the dialogue. Captions are for someone who cannot hear, so they also carry the non-speech audio: who is speaking, the phone ringing, the laugh that makes the next line land. The complication is that kind="subtitles" is the default value in HTML, and a great many correctly captioned videos ship their caption file with it. The markup cannot prove which one your .vtt contains, so a subtitles-only video is reported for review here and never counted as a failure.
- Do auto-generated captions count?
- Not on their own. SC 1.2.2 asks for captions, and the Understanding document is explicit that they have to be accurate and synchronised — automatic speech recognition mishears exactly the words that carry the most meaning, which is names, products, jargon and numbers. The practical route is the cheap one: generate the first draft automatically, then read it against the audio once and fix it. That is minutes per video, and it is the difference between a file that exists and a file that conforms.
- Why is autoplay with sound singled out?
- Because it is the one defect that stops a screen reader user from finding the fix. Their synthesised speech is now competing with your audio, and the way they would normally locate your stop button is by listening to the page — which is what your audio is drowning out. SC 1.4.2 is level A and applies to anything that plays for more than three seconds. This checker calls it a failure only when autoplay is present with no muted attribute and no controls, which is also markup every modern browser already blocks, so it is usually code that has never been tested in the browser it ships to.
- What about audio description?
- SC 1.2.3 (level A) and SC 1.2.5 (level AA) cover what is only shown on screen — the cursor moving through your product, the number appearing in the chart — for a visitor who cannot see it. This checker reports a captioned video with no descriptions track and no transcript link for review, not as a failure, because SC 1.2.3 can be met with a text alternative on the page and many conforming sites do exactly that. The cheapest structural fix is upstream: narrate what you are doing while you record, and the audio already describes the video.
- My player is built by JavaScript. Will this see it?
- Only if the <video> or the player iframe is in the HTML your server sends, which is what this reads — deliberately, because it is fast, free and the same markup a crawler sees. If the checker finds nothing on a page where you can watch something, that is itself the answer: the player arrives later. The free WCAG 2.1 AA scan renders each page in a real browser and will see it.
- Does this store my domain?
- No. The check is an HTTP GET of the page you name, run inside the request and discarded when it answers. There is no account, no email field and no row written anywhere. If you go on to run the free scan, that one does keep a report so you can come back to it, which is the whole point of a report.
Keep reading
- Which images have no alt text? →
- Can a keyboard reach everything a mouse can? →
- Can a screen reader read your table? →
- What does your heading outline look like? →
- Can a phone zoom your website? →
- Is your ARIA being thrown away? →
- What is your hamburger button called? →
- Which form fields have no label? →
- What do your links say out of context? →
- Is your PDF readable? →
- The WCAG compliance tool →
- The ADA compliance checker →