Skip to main content

GetVideoFrames API

One request turns a video link into frames.

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.

  • 60 free credits every month
  • 1 credit = 1 minute of video
  • Failed jobs are never charged
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

Paste a link and watch it work

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

From zero to frames in three steps

  1. 01

    Create a free account

    Sign in with a one-time email code. You get 60 credits right away and every month — 60 minutes of video.

  2. 02

    Create an API key

    Keys start with gvf_live_. We store only a hash, so copy it once and keep it in an environment variable.

  3. 03

    Send the video URL

    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

Ask for frames the way your pipeline thinks

Every job decodes the video once and returns frames in order with their exact timestamp in seconds.

Interval

"every": 2

One frame every N seconds (0.1–3600). Ideal for datasets, thumbnails and scene review.

Count

"count": 12

N frames spread evenly across the video or across start–end. Ideal for storyboards and previews.

Timestamps

"timestamps": [1.5, 42, 90]

Exact moments, up to 500 per job, billed per ten frames instead of per minute.

Range

"start": 30, "end": 90

Process only part of a long video and pay only for the minutes you process.

Pricing

Pay per minute of video. Start free.

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.

Free

$0/month

60 credits = 60 min of video

  • Videos up to 10 min
  • 300 frames per job
  • Frames up to 1280 px wide
  • Download links for 1 day
  • 2 active jobs at a time
  • 10 requests per minute
Create free account

Credit pack

Never expires

$10one-time

500 credits = 500 min of video

  • Videos up to 60 min
  • 2,000 frames per job
  • Frames up to 3840 px wide
  • Download links for 1 day
  • 2 active jobs at a time
  • 10 requests per minute
Buy 500 credits

Starter

$19/month

1,500 credits = 1,500 min of video

  • Videos up to 60 min
  • 2,000 frames per job
  • Frames up to 3840 px wide
  • Download links for 7 days
  • 3 active jobs at a time
  • 60 requests per minute
Subscribe

Pro

Popular

$49/month

5,000 credits = 5,000 min of video

  • Videos up to 120 min
  • 5,000 frames per job
  • Frames up to 3840 px wide
  • Download links for 7 days
  • 5 active jobs at a time
  • 120 requests per minute
Subscribe

Scale

$199/month

25,000 credits = 25,000 min of video

  • Videos up to 180 min
  • 10,000 frames per job
  • Frames up to 3840 px wide
  • Download links for 7 days
  • 10 active jobs at a time
  • 300 requests per minute
Subscribe

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

Public links from the platforms your users paste

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

Endpoints

POST/v1/jobs
Create an extraction job. Add ?wait=true to wait up to 50 s for the result.
GET/v1/jobs/:id
Status, frames with signed URLs (each has status ok or error), and zip_url when requested.
GET/v1/jobs
Your recent jobs, newest first (limit, skip, status).
GET/v1/usage
Plan, credit balance, limits and this period's usage.
GET/v1/pricing
Public price list (no key required).
url
Required. Public video link or direct video URL.
mode
interval, count or timestamps. Inferred from every / count / timestamps.
format
jpg (default), png or webp.
resolution
240, 360, 480, 720, 1080, 1440, or 2160. Default 1080. The free plan stops at 720p and returns ResolutionNotAllowed with no download links. If the video has no stream at that size, the job completes at the next lower version and resolution_note explains it. Frames are never upscaled.
max_width
Optional extra downscale, never above the requested resolution.
output
urls (default), zip or both. Jobs over 300 frames are always zipped.
webhook_url
HTTPS URL that receives job.completed or job.failed with the full job.

Errors

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 spec

Remote MCP · Live

Use the API from Claude, ChatGPT, or Cursor

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/mcp
  1. 01Create a free API key in the dashboard.
  2. 02Add the server URL as a custom connector or MCP server in your client.
  3. 03Paste the gvf_live_ key on the authorization page, then ask for frames.

FAQ

Frequently asked questions

How much does the video frame API cost?
Every account gets 60 free credits each month, which is 60 minutes of video. One credit processes one minute with up to 100 frames. For example, 100 credits cover 100 minutes. After that you can buy 500 credits for $10 (they never expire) or subscribe: Starter $19 for 1,500 credits, Pro $49 for 5,000, Scale $199 for 25,000 per month.
Can I extract frames from a YouTube video with an API?
Yes. Send the YouTube or Shorts URL to POST /v1/jobs with resolution (default 1080), an interval, a count, or timestamps. The free plan accepts up to 720p. A higher request returns an error and no links. Paid plans and credit packs can request up to 2160p. If that size is missing, you still get the next lower version plus resolution_note.
How long are the frames stored?
Free accounts keep download links for 1 day; paid plans keep them for 7 days. After that the files are deleted automatically, so copy frames to your own storage if you need them longer.
What happens if a video fails?
If some timestamps cannot be decoded, the job still completes: those frames have status "error" and url null, and you are charged only for decoded frames. Private posts, removed videos, unsupported links and jobs where no frame could be decoded return a structured error and leave your balance unchanged.
Is there a limit on video length?
Free processes up to 10 minutes per job, credit packs 60 minutes, Starter 60, Pro 120 and Scale 180. Use start and end to process a segment of a longer video.
Do you have rate limits?
Free allows 10 job requests per minute and 2 jobs in progress; paid plans allow 60–300 requests per minute and 3–10 concurrent jobs. Reading jobs and usage allows 600 requests per minute on every plan. Every response includes X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset (Unix seconds); a 429 also sends Retry-After in seconds.

Ship frame extraction today

Create a free key, paste one request, and see your first frames in seconds.