Can ChatGPT analyze YouTube videos? What actually reaches the model

Not from a link. What ChatGPT, Claude and Gemini receive from a YouTube URL, what captions cost against video tokens, and how to extract data from many videos.

By TubeExtract team · 10 min read

Semrush puts this exact question at about 140 Google searches a month in the US, with a couple of hundred more asking the same thing about Claude or “AI” in general. The short answer is no, not from a link, and the longer answer is more useful: it depends on what reaches the model, and on whether you want an answer or a dataset.

I build a structured extraction API for video, so I spend a lot of time on the gap between “the model read this video” and “the model read something about this video”. This post walks through what actually happens when you paste a YouTube URL into a chat, what each input costs in tokens, and what changes when you need the same fields out of two hundred videos instead of one.

The short answer, tool by tool

As of September 2026, according to each company’s own documentation:

ToolYouTube linkWhat works
ChatGPTNo native video input from a link.Paste the transcript, or upload a video file. OpenAI’s file uploads FAQ says its analysis of an uploaded video can be incomplete and may not cover all of it or its audio.
ClaudeNo video input at all.Anthropic’s vision docs list JPEG, PNG, GIF and WebP images, and an animated GIF is read as its first frame. Text you paste in, such as a transcript, works well.
Gemini APIYes, for public videos.Google’s video understanding docs accept a YouTube URL directly: public videos only, up to 10 per request on Gemini 2.5 and later, and 8 hours of YouTube video a day on the free tier.

These change often, so check the linked pages before you build on any of it. What does not change is the mechanism underneath, which is the rest of this post.

Captions are text, and text is cheap

If the words are what you need, the caption track is the cheapest complete input there is. One of the videos in our test set is a 20-minute talk: its auto-generated captions come to 20,534 characters, about 3,600 words. At roughly 3.5 characters per token (our extraction model’s tokenizer; others differ a little) that is around 5,900 tokens.

The same 20 minutes as native video input is a different order of magnitude. Google’s published rates are about 100 tokens per second of video at low media resolution and about 300 at full resolution, counting sampled frames plus audio.

Tokens for a 20-minute video: about 5,900 as caption text, about 122,000 as low-resolution video, about 365,000 at full resolution.Caption text≈5.9kVideo, low resolution≈122kVideo, full resolution≈365kLinear scale. Caption tokens estimated at ~3.5 characters per token; video from Gemini's published rates.
Figure 2. One 20-minute video as input tokens. Rough figures from different tokenizers, but the ratio, about 20 to 60 times, is the point.

Native video is worth those tokens when the answer is on screen: a slide, a chart, code in an editor, what a product looks like. When the answer is spoken, which covers reviews, tutorials, interviews, podcasts and most of YouTube, you pay 20 to 60 times more for frames that do not contain it.

What caption text actually looks like

Auto-generated captions are not a clean transcript. They come without punctuation or speaker labels, with tags like [music] in the middle of sentences, and with names spelled the way they sound. From the auto-captions of a video about Python AI frameworks we test with:

“…I have a few videos on my channel walking through Lang chain and I've built all kinds of things…”

“Lang chain”, two words. A model reading this for a summary does not care. A pipeline counting how often each framework is mentioned across 300 videos cares a great deal, because “Lang chain” and “LangChain” have to become the same row.

An answer is not a dataset

Chat tools are built to answer a question about one thing. Most people asking whether ChatGPT can analyse YouTube videos want exactly that, and pasting a transcript into a chat is a perfectly good way to get it. The picture changes when the question is “give me these fields from every video on this list”. Four things go wrong at once:

  • Reaching the content. Every video needs its captions fetched, and a chat window is not a batch job.
  • Shape. Ask twice and you get two layouts: a table, then a bulleted list, a price written as “$24”, then “24 dollars”. A dataset needs the same columns and the same types every time.
  • Repeatability. Sampling makes answers vary between runs, and even temperature 0 is not fully deterministic on borderline cases. Fixed columns and validation are what make two runs comparable.
  • Volume and cost. Two hundred videos at ten minutes each is a job for code, with retries and a bill you can predict.

None of this makes a chat model bad at reading. It makes a chat window the wrong container for work that has to come out the same way two hundred times.

What it takes to do it properly

This is the pipeline TubeExtract runs for every video. Each stage is there because we measured what it adds.

Pipeline: captions, then chunks of about 6,000 characters, then extraction with the schema as a template, then merging rows, then a grounding filter.Captionsmanual or autoChunks~6,000 charsExtractionschema as templateMergededupe rowsGroundingdrop unfound values
Figure 3. From caption track to rows. The schema you write drives the extraction step.

1. Chunk the text, but not too finely

A long transcript goes to the model in pieces. The size matters more than you would expect. We swept it on two real videos, three runs each, with a loosely worded schema: 3,000-character chunks found 4 of 9 items, 6,000 found 5 to 8, and 9,000 fell to 3 because generation ran into the token budget and one chunk came back truncated. 6,000 characters, about 1,700 tokens, won on every axis that moved.

2. Use a specialized extraction model, and call it its way

We don’t extract with a general chat model. TubeExtract runs a specialized model trained for exactly this job: it takes a typed JSON template of the fields you want as its own argument and fills it from the text, instead of improvising an answer. How it is called matters as much as which model it is. Paste the template into the chat message instead, and the chat template switches the model to a general-purpose task with its reasoning mode on; on a 25-minute build video with nine builds to find, that setup returned two rows and none of the nine. Called in its trained format, with the chunk size above, the same video comes back with 8 or 9 of 9, and a 26-minute restaurant tour with all 7 restaurants and nothing invented (two videos with answer keys we wrote).

3. Constrain the output

A list field without a JSON-schema constraint on generation looped: the model wrote the right answer, then kept repeating it until it hit the token budget, 6,373 characters in 36 seconds. With the constraint it stopped at the answer, 112 characters in 1.4 seconds. If you build this yourself with any model, use structured outputs wherever your provider offers them.

4. Check every value against the text

The last stage keeps only values that appear in the transcript, so a field is filled from the video, never from the model’s general knowledge. The check has to understand how people talk: prices in captions are usually spoken as words, and a check that only looks for digits would throw correct values away.

The caption says "twenty four bucks" and the model returns 24. A digit-only check would drop it; matching the spelling keeps it.caption text…twenty four bucks…model output"price": 24digit-only check: "24" in the text?no → value droppedTubeExtract: also matches the spelling"twenty four" → kept
Figure 4. A spoken price survives grounding because whole numbers are matched on their English spelling as well as their digits.

On a synthetic benchmark of 30 restaurant visits written in caption style, matching spelled-out numbers kept 11 of 15 correctly extracted prices that a digit-only check would have dropped, and brought fields correct to 96.7%.

5. Word the columns like you mean them

The column description is the instruction the model follows, so precise wording pays off directly. “A restaurant the host eats at” returns the places visited; “a restaurant” returns every place named, including “it was closed, so we skipped it”. One sentence per column is enough, and it is the cheapest accuracy there is.

So which should you use?

  • One video, one question: paste the transcript into ChatGPT or Claude. It is fast and free, and you can check the answer yourself.
  • The answer is on screen (slides, charts, code, product shots): native video input, such as the Gemini API with a YouTube URL. You pay for frames because you need them.
  • The same fields from many videos, as data you will query, chart or feed into something else: a pipeline with a fixed schema, either built along the lines above or as an API.

The third case is the one we built TubeExtract for. You describe the columns, send up to 200 video URLs in one request, and get back typed rows validated against the schema, at 10 credits per started minute of video. Everything is read from what is said, and a video without captions returns no_captions and is never charged.

curl https://api.tubeextract.dev/v1 \
-H "X-API-Key: $TUBEEXTRACT_KEY" \
-H "Content-Type: application/json" \
-d '{
"videos": ["https://www.youtube.com/watch?v=..."],
"schema": {
"multiple": true,
"columns": [
{ "name": "restaurant", "description": "A restaurant the host eats at", "type": "verbatim-string" },
{ "name": "dish", "description": "What the host orders there" },
{ "name": "verdict", "description": "Whether the host liked it", "type": "enum",
"options": ["loved it", "fine", "disliked it"] }
]
}
}'

The quickstart walks through reading the job back, and writing a schema covers the column wording that matters most, including the “eats at” versus “mentions” wording above.

Try it on your own videos

Describe the columns, send up to 200 video URLs, get typed rows back. New accounts start with 3,000 credits, about 300 minutes of video.