Resize a video
The same video rarely fits everywhere it needs to go — a 4K master is overkill for a mobile feed and too heavy for a slow connection. This endpoint rescales a clip to the exact dimensions your destination actually calls for, nothing assumed.
Run it online
Run this on our servers with your account. Free tools run in your browser; this one bills your KIT balance per the price above.
One master, a dozen destinations
A video shot once and delivered everywhere runs into a wall of conflicting requirements: a streaming feed capped at 720p to save bandwidth, a social platform that wants a specific aspect ratio, a legacy player that chokes on anything above a certain resolution. Re-exporting the source manually for each destination works until there are five destinations, then ten, and the process stops scaling with the catalog. video.resize handles that rescale as a single, repeatable step instead of a manual export done differently every time.
Sending the request
POST /video/resize with the source video and the target resolution — 1080p, 720p, or a custom width and height — and the response comes back immediately as a task_id while the rescale runs in the background. The resized file arrives through a signed webhook call once it's done, or waits at a signed link valid for 24 hours if that fits your retrieval flow better.
What actually happens during a resize
Scaling video isn't just stretching pixels; every frame gets resampled to the new dimensions using interpolation that estimates new pixel values from the surrounding original ones, then re-encoded at the target size. Scaling up from a lower resolution can't manufacture detail that was never captured, so it always looks softer than a native high-resolution source, while scaling down loses fine detail deliberately in exchange for a smaller, lighter file. Resolution standards like 1080p and 720p trace back to broadcast television's shift to digital, and streaming inherited both the names and the practical trade-offs between them.
Where it belongs in a pipeline
Resizing tends to sit early in a content pipeline, right after ingestion and before anything gets watermarked, converted to GIF or trimmed for a highlight, since every downstream step runs faster on a smaller file. Because pricing is a flat per-request fee plus a per-minute rate on the source video, resizing once to produce each target resolution — rather than re-deriving it from the largest master every time it's needed — keeps a multi-resolution catalog affordable to maintain.
What you can do with it
Adaptive streaming renditions
A video platform resizes a single master to 1080p and 720p renditions to serve different connection speeds without storing separate manual exports.
Mobile-first social clips
A marketing team resizes a widescreen product video down to a mobile-friendly resolution before publishing it to a social feed.
Legacy device compatibility
An e-learning platform resizes lecture recordings down to 720p so older devices and slower connections can still play them smoothly.
Bandwidth-conscious archiving
A media company resizes bulky 4K source footage down to 1080p for its general-access archive, keeping the original master untouched in cold storage.
FAQ
How do I resize a video with the API?
POST the source video and the target resolution to /video/resize, keep the returned task_id, and retrieve the resized file by webhook or a signed link valid for 24 hours.
Is the video resize API free?
No, there is no free tier or trial; it costs $0.077 per request plus $0.0045 per minute of video, and a failed resize is never charged.
Can I resize to a custom resolution, not just 1080p or 720p?
Yes, you can specify a custom width and height in addition to the common 1080p and 720p targets.
Does resizing up improve video quality?
No, scaling up from a lower-resolution source can't add detail that was never captured, so it always looks softer than a genuinely high-resolution original.
Does the aspect ratio change during a resize?
The resize targets the dimensions you specify, so matching the source aspect ratio or requesting a crop is up to how you set the target.
Is this endpoint live yet?
It's in deployment now, so check the endpoint status before sending production traffic since it isn't accepting jobs at this moment.
Can I resize many videos in bulk?
Yes, submit one async task per video and collect each resized file by webhook as it completes, suited to catalog-wide processing.
Is my video stored after resizing?
No, the source and resized files are deleted after the retention window and are never used for training.
For developers — API access
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.
API endpoint
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.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/video/resize \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"audio":"https://ejemplo.com/audio.mp3"}'const res = await fetch("https://api.kit.forhosting.com/video/resize", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"audio": "https://ejemplo.com/audio.mp3"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/video/resize",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"audio": "https://ejemplo.com/audio.mp3"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/video/resize", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"audio":"https://ejemplo.com/audio.mp3"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"audio":"https://ejemplo.com/audio.mp3"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/video/resize", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"audio": "https://ejemplo.com/audio.mp3"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "video.resize",
"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.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_mb | 500 |
max_minutes | 60 |
max_megapixels | 3.9 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |