# YouTube Video Downloader — MP4/MP3, Subtitles, Bulk (`memo23/youtube-video-downloader`) Actor

Download YouTube videos & Shorts as MP4 (360p–4K) or MP3 audio — in bulk, by URL or ID. Subtitles as VTT, full metadata, shareable file links, cookies for age-restricted videos, metadata-only preview mode. Only successful downloads are charged — failures are always free.

- **URL**: https://apify.com/memo23/youtube-video-downloader.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Videos, Social media, Automation
- **Stats:** 7 total users, 5 monthly users, 93.8% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $30.00 / 1,000 video download 720ps

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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 — MP4, MP3 & Subtitles [Pay Per Download]

Download YouTube videos and Shorts as MP4 (360p up to 4K) or extract MP3 audio — in bulk, by URL or video ID. Every download comes with full metadata, a shareable file link, and optional VTT subtitles. **You are only charged for successful downloads — failures cost nothing.**

Built for content teams, archivists, AI/ML pipelines, and anyone who needs YouTube media as actual files instead of links that expire.

![How it works](https://api.apify.com/v2/key-value-stores/rClOjWo9B9DPDPVwi/records/how-it-works-youtube-video-downloader.png)

### Why Use This Downloader?

- **Pay per download, never for failures** — a video that can't be downloaded is a free error row, not a charge
- **Any link format** — watch URLs, Shorts, embeds, youtu.be short links, or bare 11-character video IDs
- **Quality control** — pick 360p, 480p, 720p, 1080p, or best available (up to 4K)
- **MP3 audio mode** — extract audio only; smaller, faster, ideal for transcription pipelines
- **Subtitles included** — save captions or auto-generated subtitles as clean VTT files with their own links
- **Metadata-only mode** — pre-check a list of videos (title, duration, views) for a fraction of a cent each before committing to downloads
- **Bulk-ready** — hundreds of links per run, duplicates removed automatically, 1–5 parallel downloads
- **Age-restricted support** — supply your own YouTube cookies to unlock age-restricted or members-only videos
- **Smart fallback chain** — direct connection → residential proxy → alternate player clients → mobile endpoint, automatically per video

### Overview

This actor takes a list of YouTube video URLs or IDs and produces **one dataset row per video** containing the video's metadata (title, channel, duration, views, upload date), the download details (quality, format, file size), and stable links to the downloaded files stored in the run's key-value store.

It is a **downloader**, not a search tool — you supply the video links. To *discover* videos first (by search query, channel, or Shorts feed), pair it with the scrapers listed in [Explore More Scrapers](#explore-more-scrapers); their output plugs directly into this actor's input.

### Supported Inputs

| Input type | Example |
|---|---|
| Watch URL | `https://www.youtube.com/watch?v=jNQXAC9IVRw` |
| Shorts URL | `https://www.youtube.com/shorts/IbkzTfJCFjk` |
| Short link | `https://youtu.be/z9rdrNrkvDY` |
| Embed / live URL | `https://www.youtube.com/embed/jNQXAC9IVRw` |
| Bare video ID | `jNQXAC9IVRw` |

Extra URL parameters (`?si=`, `&t=10s`, `?feature=share`) are handled automatically. Duplicate videos in the list are downloaded only once.

**Not supported:** playlist URLs, channel URLs, and search-result URLs (feed those to the companion scrapers first and pass the resulting video URLs here). Live streams that are currently airing cannot be downloaded until they finish.

### Use Cases

| Who | What for |
|---|---|
| Content & social media teams | Archive campaign videos, repurpose content across platforms |
| AI / ML engineers | Build audio/video datasets; MP3 mode feeds Whisper-style transcription directly |
| Journalists & researchers | Preserve evidence and sources before videos disappear |
| Marketing agencies | Competitor creative analysis, ad-library building |
| Educators | Offline copies of reference material |
| Media monitoring | Automated capture of brand mentions in video form |

### How It Works

1. **Paste video links** — any mix of watch/Shorts/youtu.be URLs or bare IDs, one per line.
2. **Pick quality and format** — MP4 at your chosen resolution cap, or MP3 audio-only.
3. **The engine downloads each video** through a battle-tested fallback chain (direct → residential proxy → alternate player clients → mobile endpoint), merging streams with ffmpeg.
4. **Files are stored** in the run's key-value store with stable, shareable HTTPS links.
5. **One row per video** lands in the dataset — metadata, file size, download link, subtitles link — exportable as JSON, CSV, or Excel.

### Input Configuration

| Field | Type | Default | Description |
|---|---|---|---|
| `videoUrls` | array | — (required) | YouTube video URLs or bare 11-char video IDs |
| `quality` | string | `720p` | Max resolution: `360p`, `480p`, `720p`, `1080p`, `best`. Ignored for MP3 |
| `format` | string | `mp4` | `mp4` (video) or `mp3` (audio-only extraction) |
| `downloadSubtitles` | boolean | `false` | Also save subtitles/auto-captions as a VTT file |
| `subtitleLanguages` | array | `["en"]` | Preferred subtitle language codes, priority order |
| `metadataOnly` | boolean | `false` | Skip downloads, return only metadata rows |
| `youtubeCookies` | string | — | cookies.txt content (Netscape format) for age-restricted videos |
| `proxy` | object | none | Proxy configuration — **residential recommended**, see below |
| `maxConcurrency` | integer | `2` | Parallel downloads (1–5) |

**Typical download run:**

```json
{
    "videoUrls": [
        "https://www.youtube.com/watch?v=jNQXAC9IVRw",
        "https://youtu.be/z9rdrNrkvDY"
    ],
    "quality": "720p",
    "format": "mp4",
    "downloadSubtitles": true,
    "proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }
}
````

**Cheap pre-check before a big batch:**

```json
{
    "videoUrls": ["jNQXAC9IVRw", "z9rdrNrkvDY", "IbkzTfJCFjk"],
    "metadataOnly": true
}
```

**Audio for a transcription pipeline:**

```json
{
    "videoUrls": ["https://www.youtube.com/watch?v=jNQXAC9IVRw"],
    "format": "mp3",
    "proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

### Pricing — What a Download Really Costs

This actor uses **pay-per-event + platform usage** pricing. Two components appear on your bill, and we'd rather you understand both up front:

1. **Event fees (paid to the developer)** — flat per successful download: $0.02–0.05 per video depending on quality, $0.02 per MP3, $0.005 per subtitle file, $0.002 per metadata row. Failed downloads are never charged.
2. **Platform usage (paid to Apify at your plan's rates)** — compute and, most significantly, **proxy bandwidth**. YouTube blocks datacenter IPs, so downloads normally flow through residential proxy. As a rule of thumb, a 10-minute 720p video is roughly 45–50 MB; at Apify's standard residential rate (~$8/GB) that's about **$0.35–0.40 of usage**. Shorts cost a cent or two; a 1-hour 1080p podcast can reach $2–3. MP3 audio is ~10× cheaper than video.

So a typical 10-minute 720p download costs about **$0.03 in event fees + ~$0.37 in your platform usage**. If you have unused monthly platform credits, downloads consume those first — for many plans that makes moderate volumes effectively event-fee-only. You can also cap any run with Apify's maximum-charge limit.

### Output Overview

Each video produces exactly one dataset row: identity (`videoId`, `url`), metadata (`title`, `channel`, `channelUrl`, `durationSec`, `uploadDate`, `viewCount`), download details (`quality`, `format`, `fileSizeBytes`), and file links (`downloadUrl`, `subtitlesUrl`, `subtitlesLanguage`). Failed videos produce the same row shape with an `error` field and null file links — and no charge.

Files themselves live in the run's key-value store; the `downloadUrl` is a direct HTTPS link you can open, share, or feed to another system.

### Output Samples

**Successful 720p download with subtitles** (from a real run):

```json
{
    "videoId": "jNQXAC9IVRw",
    "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
    "title": "Me at the zoo",
    "channel": "jawed",
    "channelUrl": "https://www.youtube.com/channel/UC4QobU6STFB0P71PMvOGN5A",
    "durationSec": 19,
    "uploadDate": "2005-04-24",
    "viewCount": 399449655,
    "quality": "720p",
    "format": "mp4",
    "fileSizeBytes": 533916,
    "downloadUrl": "https://api.apify.com/v2/key-value-stores/…/records/video-jNQXAC9IVRw-1784027309504.mp4",
    "subtitlesUrl": "https://api.apify.com/v2/key-value-stores/…/records/subtitles-jNQXAC9IVRw-1784027309504.vtt",
    "subtitlesLanguage": "en"
}
```

**Metadata-only row** (`metadataOnly: true` — no file, $0.002):

```json
{
    "videoId": "jNQXAC9IVRw",
    "title": "Me at the zoo",
    "channel": "jawed",
    "durationSec": 19,
    "viewCount": 399449655,
    "uploadDate": "2005-04-24",
    "downloadUrl": null
}
```

### Key Output Fields

| Group | Fields |
|---|---|
| Identity | `videoId`, `url` |
| Video metadata | `title`, `channel`, `channelUrl`, `durationSec`, `uploadDate`, `viewCount` |
| Download details | `quality`, `format`, `fileSizeBytes` |
| File links | `downloadUrl`, `subtitlesUrl`, `subtitlesLanguage` |
| Diagnostics | `error` (only present when a download failed — the row is not charged) |

### FAQ

**Which URLs work?**
Individual video links only — watch, Shorts, embed, youtu.be, or bare IDs. Playlists and channels are not expanded; use the companion channel/search scrapers to get video URLs first.

**Why is residential proxy recommended?**
YouTube blocks requests from datacenter IP ranges. The actor tries a direct connection first, but on the Apify platform that usually fails and it falls back to your configured proxy. Without a residential proxy configured, most downloads will fail (and cost you nothing, but also get you nothing).

**How long do the file links live?**
Files sit in the run's key-value store and follow your account's storage retention (default 7+ days depending on plan). Download or transfer files you want to keep long-term.

**Can it download age-restricted or members-only videos?**
Supply `youtubeCookies` (exported from a logged-in browser session in Netscape format) and the actor passes them to the download engine. Members-only content requires a membership on the supplying account.

**What about currently-live streams?**
Not supported while live. Once the stream ends and becomes a regular video, it downloads normally.

**Does it charge for failed videos?**
No. Failures produce an `error` row and zero event charges. Proxy bandwidth already consumed by a failed attempt does appear as platform usage, but it's typically negligible because failures happen early.

**Is 4K supported?**
Yes — set `quality` to `best`. Note that 4K files are large (often 500 MB+), which matters for proxy usage costs.

### Support

- For issues or feature requests, please use the [Issues](https://console.apify.com/actors/mGV26EnaVDY2s8E1g/issues) section of this actor.
- If you need customization or have questions, feel free to contact the author:
  - Author's website: <https://muhamed-didovic.github.io/>
  - Email: <muhamed.didovic@gmail.com>

### Additional Services

Need something tailored? Custom output formats, delivery to your S3/GCS bucket, scheduled bulk archiving, integration with your transcription pipeline, or a private variant of this actor — all possible. Get in touch via the contacts above.

### Explore More Scrapers

Pair this downloader with the rest of the YouTube toolkit — their output feeds straight into `videoUrls`:

- [YouTube Search & Video Metrics Scraper](https://apify.com/memo23/youtube-search-results-scraper) — find videos by search query, get analytics-ready rows
- [YouTube Shorts Scraper](https://apify.com/memo23/youtube-shorts-scraper) — pull Shorts feeds by channel
- [YouTube Comments Scraper](https://apify.com/memo23/youtube-comments-scraper) — comments with replies for any video
- [YouTube Channel Videos Details Scraper](https://apify.com/memo23/youtube-channel-video-details-scraper) — full channel video inventories
- [Video Transcripts MCP Server](https://apify.com/memo23/transcripts-mcp-server) — plain-text transcripts for AI agents
- [YouTube Transcript Scraper with Whisper AI Fallback](https://apify.com/memo23/youtube-video-details-scraper) — SRT/VTT/JSON transcripts with translation

### ⚠️ Disclaimer

This actor is an independent tool and is **not affiliated with, endorsed by, or sponsored by YouTube or Google LLC**. "YouTube" and related trademarks are the property of Google LLC and are used here solely to describe the tool's function.

The actor processes only **publicly accessible content**. You are responsible for how you use the downloaded material: respect YouTube's Terms of Service, copyright law, and the content creators' rights in your jurisdiction. Downloading copyrighted content for redistribution without permission is illegal in most countries. Use of this tool for personal archiving, research, and other fair-use purposes is the intended scope. Comply with applicable data-protection regulations (GDPR, CCPA) where relevant.

### SEO Keywords

youtube video downloader, download youtube videos, youtube mp4 downloader, youtube to mp3, youtube shorts downloader, bulk youtube downloader, youtube downloader api, download youtube subtitles, youtube video to mp4, youtube audio extractor, youtube downloader for developers, youtube archive tool, download youtube videos in bulk, youtube video backup, yt video download api, youtube content archiving, youtube dataset builder, video download automation, youtube media pipeline, download youtube shorts mp4

# Actor input Schema

## `videoUrls` (type: `array`):

YouTube video URLs (watch, Shorts, embed, or youtu.be links) or bare 11-character video IDs. One video is downloaded per entry.

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

Maximum resolution to download. The best available stream up to this height is picked. Ignored when format is MP3.

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

MP4 downloads the video; MP3 extracts audio only (smaller and cheaper — great for transcription pipelines).

## `downloadSubtitles` (type: `boolean`):

Also save the video's subtitles or auto-generated captions as a .vtt file with its own download link.

## `subtitleLanguages` (type: `array`):

Preferred subtitle language codes in priority order (e.g. en, de, es). Only used when subtitles are enabled.

## `metadataOnly` (type: `boolean`):

Skip the file download and return only video metadata (title, channel, duration, views, upload date). Much cheaper — useful for pre-checking a list before downloading.

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

Optional cookies.txt content (Netscape format) from a logged-in YouTube session. Needed only for age-restricted or members-only videos. Export with a browser extension like 'Get cookies.txt'.

## `proxy` (type: `object`):

Proxy to use as a fallback when direct download is blocked. Leave default unless downloads fail.

## `maxConcurrency` (type: `integer`):

How many videos to download at the same time (1–5). Higher values need more memory.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  ],
  "quality": "720p",
  "format": "mp4",
  "downloadSubtitles": false,
  "subtitleLanguages": [
    "en"
  ],
  "metadataOnly": false,
  "proxy": {
    "useApifyProxy": false
  },
  "maxConcurrency": 2
}
```

# 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 = {
    "videoUrls": [
        "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
    ],
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/youtube-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 = {
    "videoUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/youtube-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 '{
  "videoUrls": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  ],
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call memo23/youtube-video-downloader --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "YouTube Video Downloader — MP4/MP3, Subtitles, Bulk",
        "description": "Download YouTube videos & Shorts as MP4 (360p–4K) or MP3 audio — in bulk, by URL or ID. Subtitles as VTT, full metadata, shareable file links, cookies for age-restricted videos, metadata-only preview mode. Only successful downloads are charged — failures are always free.",
        "version": "0.0",
        "x-build-id": "18NYEGDdEZLeTDcB7"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~youtube-video-downloader/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-youtube-video-downloader",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/memo23~youtube-video-downloader/runs": {
            "post": {
                "operationId": "runs-sync-memo23-youtube-video-downloader",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/memo23~youtube-video-downloader/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-youtube-video-downloader",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "videoUrls"
                ],
                "properties": {
                    "videoUrls": {
                        "title": "Video URLs or IDs",
                        "type": "array",
                        "description": "YouTube video URLs (watch, Shorts, embed, or youtu.be links) or bare 11-character video IDs. One video is downloaded per entry.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "quality": {
                        "title": "Video quality",
                        "enum": [
                            "360p",
                            "480p",
                            "720p",
                            "1080p",
                            "best"
                        ],
                        "type": "string",
                        "description": "Maximum resolution to download. The best available stream up to this height is picked. Ignored when format is MP3.",
                        "default": "720p"
                    },
                    "format": {
                        "title": "Output format",
                        "enum": [
                            "mp4",
                            "mp3"
                        ],
                        "type": "string",
                        "description": "MP4 downloads the video; MP3 extracts audio only (smaller and cheaper — great for transcription pipelines).",
                        "default": "mp4"
                    },
                    "downloadSubtitles": {
                        "title": "Download subtitles (VTT)",
                        "type": "boolean",
                        "description": "Also save the video's subtitles or auto-generated captions as a .vtt file with its own download link.",
                        "default": false
                    },
                    "subtitleLanguages": {
                        "title": "Subtitle languages",
                        "type": "array",
                        "description": "Preferred subtitle language codes in priority order (e.g. en, de, es). Only used when subtitles are enabled.",
                        "default": [
                            "en"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "metadataOnly": {
                        "title": "Metadata only (no download)",
                        "type": "boolean",
                        "description": "Skip the file download and return only video metadata (title, channel, duration, views, upload date). Much cheaper — useful for pre-checking a list before downloading.",
                        "default": false
                    },
                    "youtubeCookies": {
                        "title": "YouTube cookies (Netscape format)",
                        "type": "string",
                        "description": "Optional cookies.txt content (Netscape format) from a logged-in YouTube session. Needed only for age-restricted or members-only videos. Export with a browser extension like 'Get cookies.txt'."
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy to use as a fallback when direct download is blocked. Leave default unless downloads fail."
                    },
                    "maxConcurrency": {
                        "title": "Max parallel downloads",
                        "minimum": 1,
                        "maximum": 5,
                        "type": "integer",
                        "description": "How many videos to download at the same time (1–5). Higher values need more memory.",
                        "default": 2
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
