Overview
Creates a new download job. For single videos, returns a job_id. For Spotify shows, automatically creates a batch and returns a batch_id with all episode job IDs.
Your API key for authentication
Request
The video or show URL to download
Output container format. Video : mp4, mkv, webm, mov. Audio : m4a, mp3, ogg, opus. Default: mp4 (or m4a when audio_only is true)
Video codec: copy (no re-encode), h264, h265, vp9. Default: copy
Audio codec: copy (no re-encode), aac, opus, mp3. Default: copy with automatic fallback to aac if incompatible
Audio bitrate when transcoding: 64k, 128k, 192k, 256k, 320k. Default: 192k
Video quality CRF (0-51, lower = better quality). Only used when video_codec is not copy. Default: 23
Custom filename (without extension). Will be sanitized.
S3 folder prefix for organizing files. Cannot contain .. or start with /.
URL to receive completion notification via POST request.
Extract audio track only. Outputs m4a (native AAC, no re-encoding) by default. Set format to mp3, ogg, or opus for other audio formats. Supports audio_codec and audio_bitrate for transcoding control.
Download subtitles if available. Returns subtitle URL in job response.
Download video thumbnail. Returns thumbnail URL in job response.
Quality preset that overrides video_quality. Options: highest, high, medium, low, lowest.
Maximum video resolution. Options: best (default), 2160 (4K), 1440, 1080, 720, 480, 360. Works correctly for both horizontal and vertical (Shorts) videos by checking the shorter dimension.
Start timestamp for video clipping. Format: HH:MM:SS or seconds (e.g., 00:01:30 or 90).
End timestamp for video clipping. Format: HH:MM:SS or seconds (e.g., 00:05:00 or 300).
Enable live stream recording mode. Auto-detected for live URLs.
For live streams: record from the beginning (VOD mode) instead of the live point.
Maximum recording duration in seconds. Recommended for live streams as a safety cap. Example: 7200 for 2 hours.
Wait for scheduled/upcoming streams to start before downloading.
Enable progress webhooks during processing. Sends updates at each stage: downloading, muxing, uploading.
For Spotify show batches only. Creates the batch in paused mode: jobs are not enqueued for processing immediately. Use PATCH /batch/{id}/jobs to rename episodes, then POST /batch/{id}/start to launch.
Single Job Response
{
"job_id" : "550e8400-e29b-41d4-a716-446655440000"
}
Batch Response (Spotify Shows)
When the URL is a Spotify show, a batch is created automatically:
Number of episodes in the show
Whether the batch was created in paused mode
List of episode details with job IDs, URLs, and titles
List of job IDs for each episode (legacy field)
{
"batch_id" : "550e8400-e29b-41d4-a716-446655440001" ,
"total_episodes" : 142 ,
"paused" : false ,
"episodes" : [
{
"job_id" : "uuid-1" ,
"url" : "https://open.spotify.com/episode/abc" ,
"title" : "Episode 1 - Introduction"
},
{
"job_id" : "uuid-2" ,
"url" : "https://open.spotify.com/episode/def" ,
"title" : "Episode 2 - Deep Dive"
}
],
"episode_jobs" : [ "uuid-1" , "uuid-2" ]
}
{
"batch_id" : "550e8400-e29b-41d4-a716-446655440001" ,
"total_episodes" : 142 ,
"paused" : true ,
"episodes" : [
{
"job_id" : "uuid-1" ,
"url" : "https://open.spotify.com/episode/abc" ,
"title" : "Episode 1 - Introduction"
},
{
"job_id" : "uuid-2" ,
"url" : "https://open.spotify.com/episode/def" ,
"title" : "Episode 2 - Deep Dive"
}
],
"episode_jobs" : [ "uuid-1" , "uuid-2" ]
}
Examples
Single Video
With Webhook
Custom Encoding
Spotify Show (Batch)
Audio Only (m4a, default)
Audio Only (mp3)
With Subtitles & Thumbnail
Quality Preset
Resolution Selection (720p)
Video Clipping
Live Stream Recording
With Progress Webhook
curl -X POST "https://api.tornadoapi.io/jobs" \
-H "x-api-key: sk_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"format": "mp4",
"filename": "my-video"
}'
Success Response
201 Created (Single Video)
201 Created (Spotify Show Batch)
201 Created (YouTube Playlist Batch)
{
"job_id" : "550e8400-e29b-41d4-a716-446655440000"
}
Error Responses
400 Bad Request
400 Bad Request
400 Bad Request
401 Unauthorized
403 Forbidden
504 Gateway Timeout
{
"error" : "Folder name too long (max 200 characters)"
}