ForHosting KIT · Video

Extract frames from a video

Turn a video into a sequence of still images without opening an editor: pick an interval, a frame count, or exact timestamps, and get back exactly the frames you need. It exists for anyone who needs thumbnails, dataset samples, or visual proof at scale, not one video at a time by hand.

● StablePer request + per minute$0.077
Use it from WebAPIEmailApp soonTelegram soon

Run this on our servers with your account. Free tools run in your browser; this one bills your KIT balance per the price above.

Why pull frames programmatically

Teams that generate thumbnails for a video catalog, build training data for a computer-vision model, or need a quick visual index of hours of footage all hit the same wall: doing it by hand in a desktop tool doesn't scale past a handful of files. The extract frames from video api endpoint replaces that manual scrubbing with a single call that returns exactly the images you asked for, in the order you asked for them.

How a request behaves

Call POST /video/frames with a link to your source video and your extraction rule: a fixed interval in seconds, a total frame count spread evenly across the duration, or a list of explicit timestamps. The task is queued, processed asynchronously, and you get a task_id immediately; the frames themselves arrive later as a signed link or, if you prefer not to poll, a signed webhook call the moment the job finishes.

What comes back

Each extracted frame is delivered as a standard image file, named and ordered so you can map it straight back to its timestamp in the source video. There is no resizing forced on you and no watermark added; you get the pixels as they existed in that frame, ready to feed into a thumbnail grid, a labeling pipeline, or a moderation queue.

A quick note on how video sampling works

Video is just a sequence of encoded frames shown fast enough to look continuous; extracting a still frame means decoding to the nearest keyframe or interpolated frame at your requested point, which is why an interval-based request (say, every 2 seconds) tends to be faster and more predictable than requesting hundreds of arbitrary timestamps scattered across a long file.

Where it fits in a pipeline

Because the call is async and billed only on success, it slots cleanly into a larger automation: a script that uploads new videos, calls this endpoint, waits for the webhook, and hands the frames to whatever downstream step needs them, whether that's a thumbnail selector, an object detector, or a manual review dashboard.

Auto-generated thumbnails

A video platform requests one frame every 10 seconds for each new upload, then lets an internal tool pick the sharpest one as the cover image.

Training data for computer vision

A team building a defect-detection model extracts a frame every 0.5 seconds from factory-floor footage to build a labeled image dataset.

Timestamped evidence capture

A compliance workflow pulls frames at exact timestamps flagged by a separate audio transcript to document what was on screen when something was said.

Storyboard previews

A marketing team extracts 12 evenly spaced frames from a rough cut to build a quick visual storyboard for client review, no editing software required.

How do I extract frames from a video using the API?

Send a POST request to /video/frames with your video source and an extraction rule (interval, frame count, or timestamps); you get a task_id back immediately and the frames later via webhook or signed link.

Is there a free tier to test frame extraction?

There's no free tier — free tiers get abused and slow everyone down. Access runs on a prepaid ForHosting KIT balance: top up from $10.00 (it never expires) and each request is charged at its published price, so a call with no balance returns HTTP 402. No subscription, no tokens, no invented credits, and a failed task is never charged.

What image formats do I get back?

Frames are delivered as standard PNG or JPG files at the source video's native resolution, unless you request otherwise.

Can I extract frames at exact timestamps instead of a fixed interval?

Yes, you can pass a list of explicit timestamps in the request and the endpoint will return one frame per timestamp.

How is the extraction priced?

It's $0.077 per request plus $0.0045 per minute of video processed, published up front with no token system.

What happens if my job fails?

Failed tasks are retried automatically up to three times; if it still fails you get a clear error and you are never charged for a failed job.

How long do I have to download the results?

The signed link is valid for 24 hours, and the source and output files are deleted after the retention period; nothing is kept for training.

Is this endpoint live right now?

It's in final deployment and not yet accepting jobs; it will be available very soon under the same endpoint and pricing described here.

Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.

POSThttps://api.kit.forhosting.com/video/frames

Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, and soon from our app, email and Telegram.

curl -X POST https://api.kit.forhosting.com/video/frames \
  -H "Authorization: Bearer $KIT_KEY" \
  -H "Content-Type: application/json" \
  -d '{"audio":"https://ejemplo.com/audio.mp3"}'
{
  "audio": "https://ejemplo.com/audio.mp3"
}
{
  "task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
  "type": "video.frames",
  "status": "queued",
  "_links": {
    "result": "/tasks/tsk_…/result"
  }
}

The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.

Per request$0.077
Per minute$0.0045

Published price — no tokens, no invented credits. A failed task is never charged.

max_mb500
max_minutes60
max_megapixels3.9
HTTPCodeMeaning
401unauthorizedMissing or invalid API key.
402insufficient_balanceYour balance doesn't cover the task price.
404unknown_typeThat task type doesn't exist.
429rate_limitedToo many requests. Use the webhook instead of polling.

Read the full KIT documentation →