Interval
"every": 2One frame every N seconds (0.1–3600). Ideal for datasets, thumbnails and scene review.
GetVideoFrames API
Send a YouTube, TikTok, Instagram, Facebook, X, Vimeo or MP4 URL. Get back JPG, PNG or WebP frames by interval, count or exact timestamp — as signed URLs or a ZIP. No downloaders, no FFmpeg servers, no proxies to maintain.
curl -X POST "https://api.getvideoframes.com/v1/jobs?wait=true" \
-H "Authorization: Bearer $GVF_API_KEY" \
-H "Content-Type: application/json" \
-d '{"resolution":1080,"every":2,"format":"jpg","url":"https://www.youtube.com/shorts/VIDEO_ID"}'Try it now
This is the same pipeline the API uses. The free preview returns six 640 px frames. With an API key you choose the resolution: 720p on the free plan, up to 2160p on a pack or subscription.
Quickstart
Sign in with a one-time email code. You get 60 credits right away and every month — 60 minutes of video.
Keys start with gvf_live_. We store only a hash, so copy it once and keep it in an environment variable.
POST /v1/jobs with ?wait=true returns the finished frames in the same response for most short videos. Longer jobs return an id to poll or a webhook.
Response
{
"id": "6d31d862-2fbe-4304-92bc-44d78fd8d36c",
"status": "completed",
"platform": "youtube",
"duration_seconds": 19.06,
"frames_count": 10,
"frames_failed": 0,
"credits_charged": 1,
"width": 1920,
"height": 1080,
"frames": [
{ "index": 1, "timestamp": 0, "status": "ok", "url": "https://…/frame_00001.jpg?X-Amz-Signature=…", "error": null },
{ "index": 2, "timestamp": 2, "status": "ok", "url": "https://…/frame_00002.jpg?X-Amz-Signature=…", "error": null }
],
"zip_url": null,
"expires_at": "2026-10-01T14:00:21Z"
}Extraction modes
Every job decodes the video once and returns frames in order with their exact timestamp in seconds.
"every": 2One frame every N seconds (0.1–3600). Ideal for datasets, thumbnails and scene review.
"count": 12N frames spread evenly across the video or across start–end. Ideal for storyboards and previews.
"timestamps": [1.5, 42, 90]Exact moments, up to 500 per job, billed per ten frames instead of per minute.
"start": 30, "end": 90Process only part of a long video and pay only for the minutes you process.
Pricing
One credit equals one minute of video, with up to 100 frames included in that minute. For example, 100 credits cover 100 minutes. Exact timestamps cost one credit per ten frames. Failed jobs are never charged.
$0/month
60 credits = 60 min of video
$10one-time
500 credits = 500 min of video
$19/month
1,500 credits = 1,500 min of video
$49/month
5,000 credits = 5,000 min of video
$199/month
25,000 credits = 25,000 min of video
Prices in USD. Subscriptions renew monthly and reset the monthly credits; pack credits stack on top and never expire. Cancel or switch plans anytime from the billing portal.
Supported sources
YouTube (videos and Shorts), TikTok, Instagram Reels and posts, Facebook videos and Reels, X, Vimeo, Google Drive share links, and any direct .mp4, .mov or .webm video URL.
Only public videos can be processed. Private, deleted or login-only posts return a PrivateContent error and cost nothing.
Reference
Errors return JSON with data.name (InvalidUrl, ResolutionNotAllowed, PrivateContent, VideoTooLong, TooManyFrames, InsufficientBalance, RateLimited…) and a short data.userMessage you can show to your users. A missing credential is AuthenticationRequired. A header that is not "Authorization: Bearer gvf_live_…" or "X-API-Key" is InvalidApiKey with data.reason "malformed". A well-formed key that is unknown or revoked is InvalidApiKey with data.reason "invalid".
Download the OpenAPI 3.1 specRemote MCP · Live
Paste a video link in your AI chat and get the frames back, with no code. The MCP server uses your API key and the same credits as the REST API.
Server URL
https://mcp.getvideoframes.com/mcpFAQ
Create a free key, paste one request, and see your first frames in seconds.