Download Media

Download and optionally process video or audio from any supported platform.

POST /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
Response

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.

This site uses only essential cookies required for the service to function (session authentication and security). We do not use analytics, tracking, or advertising cookies. Learn more