# YouTube Video Downloader – Get Direct MP4 & 4K Links by URL (`endspec/youtube-instant-video-downloader`) Actor

Get direct download links and metadata for any YouTube video by URL or ID: progressive MP4, adaptive video up to 4K, and audio-only tracks, with resolution, codec, FPS and file size. Batch many videos in one run. No login, no cookies, no YouTube API key. Pay only per video processed.

- **URL**: https://apify.com/endspec/youtube-instant-video-downloader.md
- **Developed by:** [EndSpec](https://apify.com/endspec) (community)
- **Categories:** Videos, Social media, Automation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $14.00 / 1,000 video processeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## YouTube Video Downloader — Get Direct MP4 / 4K Download Links by URL

Get direct **YouTube video download links** and metadata for any video by URL or ID. This YouTube video downloader returns every available format — progressive MP4 (video + audio), adaptive video up to **4K**, and audio-only tracks — each with resolution, codec, FPS and file size. No login, no cookies, no YouTube Data API key.

### Quick start (input → output)

**Input:**

```json
{ "videos": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"], "type": "all" }
```

**Output (one row per video):**

```json
{
  "videoId": "dQw4w9WgXcQ",
  "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
  "title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
  "channelTitle": "Rick Astley",
  "lengthSeconds": 213,
  "viewCount": 1600000000,
  "thumbnail": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg",
  "formatCount": 27,
  "formats": [
    { "itag": 18, "kind": "progressive", "quality": "360p", "container": "mp4", "width": 640, "height": 360, "fps": 25, "hasVideo": true, "hasAudio": true, "sizeBytes": 9500000, "url": "https://redirector.googlevideo.com/..." },
    { "itag": 313, "kind": "video_only", "quality": "2160p", "container": "webm", "width": 3840, "height": 2160, "fps": 25, "hasVideo": true, "hasAudio": false, "url": "https://redirector.googlevideo.com/..." }
  ]
}
```

### What this actor does

- Accepts one or many YouTube videos (`watch?v=`, `youtu.be/`, `/shorts/`, or a bare 11-char ID).
- Returns, per video: metadata (title, channel, length, views, thumbnail) plus a normalized list of downloadable **formats** with direct URLs.
- Filter what you get with `type`: `all`, `video` (progressive MP4 with audio), `video_only` (adaptive streams incl. 4K), or `audio`.

### Input parameters

| Field | Type | Required | Description |
|---|---|---|---|
| `videos` | array of strings | ✅ | YouTube video URLs or 11-character IDs. |
| `type` | string | — | `all` (default), `video`, `video_only`, or `audio`. |

**Important notes**

- Download URLs are official YouTube CDN links and are **time-limited** — fetch them soon after the run.
- Progressive (`kind: "progressive"`) formats contain both audio and video; adaptive `video_only`/`audio` are separate streams (mux them yourself for 1080p+).
- Private, age-restricted, or removed videos return an error row and are **not** charged.

#### More input examples

```json
{ "videos": ["dQw4w9WgXcQ"], "type": "video" }
```

```json
{ "videos": ["https://youtu.be/9bZkp7q19f0"], "type": "audio" }
```

### Output

#### Field reference

| Field | Description |
|---|---|
| `videoId`, `url`, `title`, `channelTitle`, `channelId` | Video + channel identity. |
| `lengthSeconds`, `viewCount`, `thumbnail` | Basic metadata. |
| `formatCount` | Number of formats returned after `type` filtering. |
| `formats[]` | `{ itag, kind, quality, container, mimeType, width, height, fps, bitrate, sizeBytes, hasVideo, hasAudio, url }`. |

#### Output examples

**No formats / unavailable** (not charged):

```json
{ "status": "error", "error": "No downloadable formats were found for this video (it may be private, age-restricted, or removed). You were not charged." }
```

**Bad input** (not charged):

```json
{ "status": "error", "error": "That input is not a valid YouTube video URL or ID. Please check it and try again. You were not charged." }
```

**Service busy** (not charged):

```json
{ "status": "error", "error": "The download service is temporarily unavailable — please retry shortly. You were not charged." }
```

### Use cases

- **Creators / editors:** grab source files and specific resolutions for re-use you're licensed to make.
- **Archivists:** capture metadata + best-quality streams for allowed offline backup.
- **Developers:** build "paste a link, get formats" features without maintaining an extractor.

### Best practices

- Use `type: "video"` when you want a single ready-to-play MP4 with sound.
- Use `type: "video_only"` for 1080p+/4K, then mux with an `audio` track.
- Download promptly — CDN URLs expire.

### Pricing

Pay-per-event: charged **once per video processed** (a row with at least one format). Errors are **never** charged.

### Legality

Only download content you own or are licensed/permitted to download. Respect copyright, YouTube's Terms of Service, and applicable law. You are solely responsible for how you use the links and files.

### FAQ

**Do I need an API key?** No.
**Can I get 4K?** Yes — via `type: "all"` or `video_only` (adaptive `2160p`).
**Why is 1080p video-only?** YouTube serves high-res video and audio as separate adaptive streams — mux them.
**Why did the URL stop working?** CDN links are time-limited; re-run to refresh.

### Support

Email **contact@endspec.net** — we typically reply within one business day.

# Actor input Schema

## `videos` (type: `array`):

One or more YouTube video URLs or 11-character video IDs. Each video returns its metadata and available download formats. Accepts watch?v=, youtu.be/, and /shorts/ links.

## `type` (type: `string`):

Which formats to include: all, video (progressive MP4 with audio), video\_only (adaptive video streams, incl. 4K), or audio (audio-only tracks).

## Actor input object example

```json
{
  "videos": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  ],
  "type": "all"
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "videos": [
        "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("endspec/youtube-instant-video-downloader").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "videos": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"] }

# Run the Actor and wait for it to finish
run = client.actor("endspec/youtube-instant-video-downloader").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "videos": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  ]
}' |
apify call endspec/youtube-instant-video-downloader --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=endspec/youtube-instant-video-downloader",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/cZ7yojC9bbWsT8QWe/builds/QcWSCKCRrDdHlBasP/openapi.json
