Video Frames & Keyframes for AI Vision
Turn a video file into a small set of meaningful still images that an AI vision model can look at: one frame per scene, every N seconds, N evenly spaced, or at exact timestamps. Each frame comes with its timestamp, an image URL, optional base64 and optional OCR text.
Run it on ApifyUse it from an agentWhat it does
| Mode | What you get |
|---|---|
scenes | One frame per scene change, found from keyframes without decoding the whole video. A 1-hour video is scanned in seconds |
interval | A frame every N seconds |
count | N evenly spaced frames |
timestamps | Frames at exact times, in seconds or hh:mm:ss.mmm |
- Reads only what it needs. Outside scenes mode it fetches just the parts of the file it needs (HTTP range requests).
- Near-duplicates dropped, so a static slide doesn't come back 30 times. Contact sheets show the whole video on one image (free).
- OCR reads on-screen text: slides, captions, UI screens, whiteboards.
- MP4, MOV, WebM, MKV, AVI and most other formats FFmpeg reads. Phone rotation is applied.
Example
Twelve evenly spaced frames with on-screen text, good for slide decks and screen recordings:
{"videoUrls": ["https://example.com/webinar.mp4"],
"mode": "count",
"frameCount": 12,
"ocr": true}
One frame item (shortened):
{"type": "frame", "video_name": "webinar.mp4", "frame_index": 3,
"timestamp_s": 42.0, "timecode": "00:00:42.000", "width": 1024, "height": 576,
"image_url": "https://api.apify.com/v2/key-value-stores/.../records/v001-f0003-42s.jpg",
"ocr_text": "Q3 roadmap"}
Links must point to video files. Pages on YouTube, TikTok, Instagram or Vimeo fail with PLATFORM_URL_NOT_SUPPORTED.
Use it
In the Apify Console
Open the Actor page on Apify, fill in the input form and click Start. Results land in the run's dataset (JSON, CSV or Excel download).
From an AI agent (MCP)
Apify's hosted MCP server exposes the Actor as a tool to Claude, Cursor, VS Code and other MCP clients. Server URL:
https://mcp.apify.com/?tools=errandkit/video-frames-for-ai
For example, in Claude Code (sign in to Apify when asked, or add --header "Authorization: Bearer YOUR_APIFY_TOKEN"):
claude mcp add --transport http errandkit "https://mcp.apify.com/?tools=errandkit/video-frames-for-ai"
Copy-paste config for Claude Desktop, Cursor, VS Code, Windsurf and ChatGPT →
From code (Apify API)
curl -X POST "https://api.apify.com/v2/acts/errandkit~video-frames-for-ai/run-sync-get-dataset-items" \
-H "Authorization: Bearer YOUR_APIFY_TOKEN" -H "Content-Type: application/json" \
-d '{"videoUrls":["https://example.com/demo.mp4"],"mode":"scenes","maxFrames":20}'
Errandkit doesn't run its own hosted API yet. Every way of using this tool goes through your Apify account.
Pricing
| Event | Price | Per 1,000 |
|---|---|---|
| Frame extracted | $0.001 | $1.00 |
Frame OCR (only with ocr, only frames where text was found) | $0.001 | $1.00 |
| Video data read (per started 10 MB actually downloaded) | $0.001 | $1.00 |
| Actor start (Apify standard) | $0.00005 | $0.05 |
Examples: 12 frames from a 100 MB, 10-minute video in count mode (reads about 25 MB) cost about $0.015. 20 scenes from the same video cost about $0.03. Uploaded and base64 files have no data charge. Videos that fail aren't charged.
Launch prices. The price shown on the Apify Store page is the one you are charged, and Apify shows it before every run.
Limits
- Up to 2 GB and 4 hours per video. Base64 input up to 25 MB.
- Scenes mode uses keyframes, so frame times are usually within a fraction of a second of the cut. Videos with very few keyframes get a warning; use
intervalorcountfor those.
Your data
Videos are processed inside your own Apify run. Nothing is sent to any third-party service or AI model, and nothing is kept by us. Frames live in your run storage under your account's retention settings. Details: privacy.