Download Media
Download and optionally process video or audio from any supported platform.
/v1/download
1–2 credits
Description
Download and optionally process video or audio from any supported URL. Supports quality selection,
format conversion, clip trimming, and audio processing (normalization, noise reduction, silence trimming).
This is an async endpoint — it returns a job_id that you poll or listen for via webhooks.
Request Body
Send a JSON body with the following parameters:
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| url | string | Yes | — | Source video URL |
| quality | string | No | "best" | Quality: "best", "1080p", "720p", "480p", "audio" |
| format | string | No | null | Output format: "mp4", "webm", "mkv", "mp3", "wav". Null = platform default. |
| clip_start | string | No | null | Clip start timestamp ("HH:MM:SS", "MM:SS", or seconds) |
| clip_end | string | No | null | Clip end timestamp |
| processing | string[] | No | null | Processing options: "normalize", "denoise", "trim_silence" |
| webhook_url | string | No | null | One-off webhook URL for this job |
Credit Cost
Base cost is 1 credit. If any processing options are used
(normalize, denoise, or trim_silence), the cost increases to 2 credits.
Code Examples
Full Example (with processing)
curl -X POST "https://videoconduit.com/v1/download" \
-H "Authorization: Bearer vc_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"url": "https://youtube.com/watch?v=dQw4w9WgXcQ",
"quality": "720p",
"format": "mp4",
"processing": ["normalize", "denoise"]
}'import requests
response = requests.post(
"https://videoconduit.com/v1/download",
headers={"Authorization": "Bearer vc_your_api_key"},
json={
"url": "https://youtube.com/watch?v=dQw4w9WgXcQ",
"quality": "720p",
"format": "mp4",
"processing": ["normalize", "denoise"],
},
)
data = response.json()
print(data["job_id"])const response = await fetch("https://videoconduit.com/v1/download", {
method: "POST",
headers: {
"Authorization": "Bearer vc_your_api_key",
"Content-Type": "application/json",
},
body: JSON.stringify({
url: "https://youtube.com/watch?v=dQw4w9WgXcQ",
quality: "720p",
format: "mp4",
processing: ["normalize", "denoise"],
}),
});
const data = await response.json();
console.log(data.job_id);$client = new GuzzleHttp\Client();
$response = $client->post("https://videoconduit.com/v1/download", [
"headers" => ["Authorization" => "Bearer vc_your_api_key"],
"json" => [
"url" => "https://youtube.com/watch?v=dQw4w9WgXcQ",
"quality" => "720p",
"format" => "mp4",
"processing" => ["normalize", "denoise"],
],
]);
$data = json_decode($response->getBody(), true);
echo $data["job_id"];body := strings.NewReader(`{
"url": "https://youtube.com/watch?v=dQw4w9WgXcQ",
"quality": "720p",
"format": "mp4",
"processing": ["normalize", "denoise"]
}`)
req, _ := http.NewRequest("POST", "https://videoconduit.com/v1/download", body)
req.Header.Set("Authorization", "Bearer vc_your_api_key")
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
var data map[string]interface{}
json.NewDecoder(resp.Body).Decode(&data)require "net/http"
require "json"
uri = URI("https://videoconduit.com/v1/download")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer vc_your_api_key"
req["Content-Type"] = "application/json"
req.body = {
url: "https://youtube.com/watch?v=dQw4w9WgXcQ",
quality: "720p",
format: "mp4",
processing: ["normalize", "denoise"],
}.to_json
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)
puts data["job_id"]Basic Download
curl -X POST "https://videoconduit.com/v1/download" \
-H "Authorization: Bearer vc_your_api_key" \
-H "Content-Type: application/json" \
-d '{"url": "https://youtube.com/watch?v=dQw4w9WgXcQ"}'Audio Extraction
curl -X POST "https://videoconduit.com/v1/download" \
-H "Authorization: Bearer vc_your_api_key" \
-H "Content-Type: application/json" \
-d '{"url": "https://youtube.com/watch?v=dQw4w9WgXcQ", "quality": "audio", "format": "mp3"}'Clip Trimming
curl -X POST "https://videoconduit.com/v1/download" \
-H "Authorization: Bearer vc_your_api_key" \
-H "Content-Type: application/json" \
-d '{"url": "https://youtube.com/watch?v=dQw4w9WgXcQ", "clip_start": "00:01:30", "clip_end": "00:02:00"}'Response
Initial Response
Returned immediately when the job is created:
{
"job_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "pending",
"credits_charged": 1
}
Completed Job
Returned from GET /v1/jobs/{id} when the job finishes:
{
"job_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "completed",
"download_url": "https://dl.videoconduit.com/files/a1b2c3d4.mp4",
"result_data": {
"title": "Rick Astley - Never Gonna Give You Up",
"duration": 212.0,
"format": "mp4",
"filesize": 15234567
},
"expires_at": "2025-01-15T12:00:00Z"
}
Download URLs Expire
Download URLs expire after the configured TTL (default: 60 minutes). Download the file promptly or request a new job.
Processing Options
Pass one or more processing options in the processing array to apply audio transformations.
normalize
Loudness normalization to −16 LUFS (broadcast standard). Ensures consistent volume across
different source videos. Uses ffmpeg's loudnorm filter.
denoise
Reduce background noise from audio. Uses ffmpeg's afftdn filter. Best for speech
content with constant background hum.
trim_silence
Remove silence from the start and end of the audio. Useful for cleaning up recordings. Does not remove silence in the middle.
Try It
{# Usage: {% include "docs/_playground.html" with endpoint_method="POST" endpoint_path="/v1/download" fields=playground_fields %} playground_fields is a list of dicts passed from the view: [ {"name": "url", "type": "text", "required": True, "placeholder": "https://youtube.com/watch?v=...", "label": "Video URL"}, {"name": "quality", "type": "select", "options": ["best", "1080p", "720p", "480p", "audio"], "default": "best", "label": "Quality"}, ] #}Try It
POST /v1/download
Notes
Async Operation
This endpoint returns a job_id immediately. Poll GET /v1/jobs/{id} for status updates, or configure webhooks for push notifications.
Probe First
Use GET /v1/info (1 credit) to check available formats and qualities before downloading. It helps you choose the right parameters.