← Blog

How to Upload Video to Claude: What Actually Works

2026-09-14 · 5 min read · SubToAPI Team

If you've tried dragging an .mp4 file into Claude's chat window or attaching one through the API, you've probably noticed it doesn't work. Claude does not support direct video upload. Its multimodal input is limited to static images (JPEG, PNG, GIF, WebP) and PDF documents — there's no video content type in the Messages API, on the desktop app, or in the mobile app.

That's not the end of the story, though. You can absolutely get Claude to analyze, summarize, or answer questions about video content — you just have to convert the video into something Claude can read first. This article covers the two practical methods that work today: extracting frames as images, and extracting audio as a transcript. Most real-world use cases combine both.

Why Claude Can't Take Video Directly

Anthropic's models process vision inputs as discrete images passed alongside text in a single request. There's no video decoder in the pipeline — no frame sampling, no audio track parsing, no timestamp awareness built in. This is true whether you're calling Claude through Anthropic's own API, through claude.ai, or through a wrapper service. Any tool that claims to accept raw video for Claude is doing the conversion behind the scenes, not handing the file straight to the model.

Knowing this changes how you approach the problem: instead of looking for an "upload video" button, you build a small pipeline that turns video into images and/or text, then sends that to Claude like any other multimodal request.

Method 1: Extract Frames and Send Them as Images

This is the most reliable way to give Claude visual understanding of a video. Use ffmpeg to pull frames at a regular interval:

ffmpeg -i input.mp4 -vf fps=1/5 frame_%03d.jpg

This grabs one frame every 5 seconds — adjust the interval based on how much motion or detail matters. A fast-paced tutorial might need one frame every 2 seconds; a slow product demo can work fine at one every 10.

Once you have your frames, base64-encode them and send them in order as image blocks in a single message:

{
  "role": "user",
  "content": [
    { "type": "image", "source": { "type": "base64", "media_type": "image/jpeg", "data": "<frame_001>" } },
    { "type": "image", "source": { "type": "base64", "media_type": "image/jpeg", "data": "<frame_002>" } },
    { "type": "image", "source": { "type": "base64", "media_type": "image/jpeg", "data": "<frame_003>" } },
    { "type": "text", "text": "These are sequential frames from a video, 5 seconds apart. Describe what happens over time." }
  ]
}

Claude reads the frames in order and reasons about the sequence — good enough to describe a demo, spot a UI bug across a screen recording, or summarize a presentation's slide changes.

Limits to keep in mind:

If you're calling this through SubToAPI instead of managing raw API keys yourself, the request format is identical — you just point it at your SubToAPI application key. See /docs/messages for the exact content-block schema:

curl https://api.subtoapi.app/v1/messages \
  -H "Authorization: Bearer $SUBTOAPI_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-sonnet",
    "max_tokens": 500,
    "messages": [{
      "role": "user",
      "content": [
        { "type": "image", "source": { "type": "base64", "media_type": "image/jpeg", "data": "'"$(base64 -w0 frame_001.jpg)"'" } },
        { "type": "text", "text": "Summarize what is happening in this video frame." }
      ]
    }]
  }'

Method 2: Transcribe the Audio and Send Text

For talk-heavy content — interviews, lectures, meetings — the audio track usually carries more useful information than the visuals. Extract it with ffmpeg:

ffmpeg -i input.mp4 -q:a 0 -map a audio.mp3

Run it through a speech-to-text tool (Whisper, or any transcription service you already use) to get plain text, then send the transcript directly to Claude:

{
  "role": "user",
  "content": [
    { "type": "text", "text": "Here is a transcript of a 20-minute meeting. Summarize the key decisions and action items:\n\n[transcript text]" }
  ]
)

This is cheaper and simpler than frame extraction, and it handles long videos well since text compresses much better than images. It's also the better choice when you need exact quotes or need Claude to answer questions about what was said rather than what was shown.

Method 3: Combine Frames and Transcript

For the richest results — think product demo videos, tutorials, or training content — send both: sampled frames for visual context and the transcript for spoken content, in the same request. Claude can then correlate what's being said with what's on screen, which is useful for things like "what did the presenter click on when they mentioned pricing?"

{
  "role": "user",
  "content": [
    { "type": "image", "source": { "type": "base64", "media_type": "image/jpeg", "data": "<frame_003>" } },
    { "type": "text", "text": "Transcript around this timestamp: '...and here you'll see the pricing tab...'\n\nDoes the frame match what's being described?" }
  ]
}

Practical Tips

If you're building this into a product — say, a video review tool or a meeting-summary app — SubToAPI gives you application-scoped keys, usage metadata per request, and team seats so you can track exactly how much frame/transcript volume each part of your pipeline is consuming. Check /docs/quickstart to get a key running in a few minutes, or /pricing if you're evaluating it for a team.

questions

Can Claude analyze a YouTube video if I just paste the link? No. Claude can't fetch or watch external video URLs. You need to download the video, extract frames or audio, and send those as the actual content.

Is there a file size or duration limit for this approach? There's no video-specific limit since you're not sending video files — the real constraint is the combined size of the images and text in your request, which is bound by the model's context window and per-request image limits.

Will Claude eventually support native video upload? Anthropic hasn't shipped native video input as of now. Until it does, frame extraction plus transcription remains the standard workaround, and it works well for most practical use cases.

Turn your Claude access into an HTTPS API

SubToAPI gives you application API keys, streaming, tool use and usage insights on top of your existing Claude access — set up in minutes.

Start free  Read the quickstart →