# Kick VOD Downloader (`maximedupre/download-kick-vod`) Actor

Download up to 25 public Kick VODs from full URLs, or resolve VOD metadata without copying media. Choose a maximum rendition or file size and get structured details, with a stored file for successful downloads.

- **URL**: https://apify.com/maximedupre/download-kick-vod.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Videos, Social media, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.95 / 1,000 stored files

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### 📥 Download Kick VODs

Download public Kick VODs for creators, researchers, and archive teams. Submit full VOD URLs to store the media or resolve metadata without copying it. Get channel, title, timing, views, categories, thumbnail, HLS source, and stored-file details in a dataset.

- Download a public VOD from a full URL with **[Download Kick Videos](https://apify.com/maximedupre/download-kick-vod/examples/download-kick-videos)**.
- Save several submitted VOD URLs in one run with **[Kick Video Downloader](https://apify.com/maximedupre/download-kick-vod/examples/kick-video-downloader)**.
- Resolve a VOD into channel, timing, views, and source details with **[Download Kick VOD](https://apify.com/maximedupre/download-kick-vod/examples/download-kick-vod)**.
- Choose a maximum rendition before storing a VOD with **[Kick VOD Downloader Online](https://apify.com/maximedupre/download-kick-vod/examples/kick-vod-downloader-online)**.
- Set a maximum stored-file size before a download with **[Kick VOD Downloader](https://apify.com/maximedupre/download-kick-vod/examples/kick-vod-downloader)**.

#### 🎞️ Kick VOD data and stored files

Every successful VOD resolution produces one dataset row. The row keeps the public source URL, VOD and channel identity, title, source time, duration, views, categories, maturity, thumbnail, and HLS source when available. A successful download row also includes the selected rendition, media type, byte size, and a stored-file download URL.

Metadata mode returns the shared VOD fields without a `file` object. Download mode adds that object when the file is stored successfully.

#### ▶️ Run a Kick VOD download

**Run steps**

1. Choose `Download stored files` or `Resolve metadata`.
2. Add one or more full public Kick VOD URLs in `vodUrls`. You can submit up to 25 URLs in one run.
3. For download mode, choose `maxQuality` and, if needed, `maxFileSizeMb`. These download options are ignored for metadata mode.
4. Start the run and open the dataset. The Actor reports retrieval or storage problems for VODs it cannot resolve or store.

If the same VOD is submitted more than once, the first eligible occurrence is saved and later duplicates are ignored.

#### ⚙️ Input

Choose whether to store the VOD media or return metadata. Other Kick pages and shortened URLs are not supported.

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `resultType` | string | Choose `download` to store each VOD file or `metadata` to resolve VOD details without copying media. |
| `maxQuality` | string | Sets the highest rendition for download runs: `best`, `1080p`, `720p`, `480p`, or `360p`. `best` uses the highest rendition found for each VOD. |
| `maxFileSizeMb` | integer | Sets the largest stored file size in megabytes. The run reports when a VOD is larger than this limit. For download runs, leave it empty to allow any size and return all available results until the source is exhausted. |
| `vodUrls` | array of strings | Contains one or more full public Kick VOD URLs. You can submit up to 25 URLs in one run. |

**Example input**

This is the public input from successful current-beta default-input run `jUw2qR0smkLDOmAp5`:

```json
{
  "resultType": "download",
  "maxQuality": "best",
  "vodUrls": [
    "https://kick.com/destiny/videos/62c42d7e-1420-4061-bb25-b209b190fc4a"
  ]
}
```

#### 🧾 Output

The Output tab links to the dataset. It contains successful VOD rows.

**Dataset link**

| Field | Type | What it does |
| --- | --- | --- |
| `dataset` | string (URL) | Opens the dataset with one row for each VOD resolved successfully. |

**Metadata result**

This shape is returned when `resultType` is `metadata`. It has no `file` object.

| Field | Type | What it does |
| --- | --- | --- |
| `vodId` | string | Stable ID of the Kick VOD. |
| `vodUrl` | string (URL) | Public Kick URL for the VOD. |
| `title` | string | Title of the VOD. |
| `channel` | object | Kick channel that owns the VOD. |
| `channel.id` | string | Stable ID of the Kick channel. |
| `channel.username` | string | Kick username of the channel. |
| `channel.displayName` | string | Displayed name of the Kick channel. |
| `createdAt` | string (ISO date-time) | Time when the source created the VOD. |
| `durationSeconds` | number | Length of the VOD in seconds. |
| `views` | integer | Number of views reported by Kick. |
| `categories` | array of strings | Categories assigned to the VOD. |
| `isMature` | boolean | Whether Kick marks the VOD as mature content. |
| `thumbnailUrl` | string (URL) | URL of the VOD thumbnail when available. |
| `hlsUrl` | string (URL) | Public HLS master-playlist URL when available. |

**Example metadata row**

This genuine row is from current-beta run `Io4esFfLKY9ug5Dr6`:

```json
{
  "vodId": "120625104",
  "vodUrl": "https://kick.com/destiny/videos/62c42d7e-1420-4061-bb25-b209b190fc4a",
  "title": "memein' and streamin' and buildin' my dreamin'",
  "channel": {
    "id": "1772249",
    "username": "destiny",
    "displayName": "Destiny"
  },
  "createdAt": "2026-08-31T02:38:37.000Z",
  "durationSeconds": 16,
  "views": 1576,
  "categories": [
    "Factorio"
  ],
  "isMature": false,
  "thumbnailUrl": "https://kick-prod-videos-30-day.s3.us-west-2.amazonaws.com/thumbnails/livestream/124925768/thumb0/video_thumbnail/thumb0.jpg?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAS3MDRZGPKNHGJGNE%2F20260925%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20260925T202520Z&X-Amz-SignedHeaders=host&X-Amz-Expires=300&X-Amz-Signature=7e18a87028f16ddffb004c6355d165034c5f8bc328a9600a0a022b8aa00ac02e",
  "hlsUrl": "https://stream.kick.com/3c81249a5ce0/ivs/v1/196233775518/0PMYoN0I2p4i/2026/8/31/2/38/h507b6mByCG3/media/hls/master.m3u8"
}
```

**Download result**

This shape is returned when `resultType` is `download` and the VOD file is stored successfully.

| Field | Type | What it does |
| --- | --- | --- |
| `vodId` | string | Stable ID of the Kick VOD. |
| `vodUrl` | string (URL) | Public Kick URL for the VOD. |
| `title` | string | Title of the VOD. |
| `channel` | object | Kick channel that owns the VOD. |
| `channel.id` | string | Stable ID of the Kick channel. |
| `channel.username` | string | Kick username of the channel. |
| `channel.displayName` | string | Displayed name of the Kick channel. |
| `createdAt` | string (ISO date-time) | Time when the source created the VOD. |
| `durationSeconds` | number | Length of the VOD in seconds. |
| `views` | integer | Number of views reported by Kick. |
| `categories` | array of strings | Categories assigned to the VOD. |
| `isMature` | boolean | Whether Kick marks the VOD as mature content. |
| `thumbnailUrl` | string (URL) | URL of the VOD thumbnail when available. |
| `hlsUrl` | string (URL) | Public HLS master-playlist URL when available. |
| `file` | object | Details for the stored VOD file. |
| `file.downloadUrl` | string (URL) | URL to download the stored VOD file. |
| `file.rendition` | string | Video rendition selected for the stored file. |
| `file.mediaType` | string | Media type of the stored VOD file. |
| `file.sizeBytes` | integer | Size of the stored VOD file in bytes. |

**Example download row**

This genuine row is from current-beta run `jUw2qR0smkLDOmAp5`:

```json
{
  "vodId": "120625104",
  "vodUrl": "https://kick.com/destiny/videos/62c42d7e-1420-4061-bb25-b209b190fc4a",
  "title": "memein' and streamin' and buildin' my dreamin'",
  "channel": {
    "id": "1772249",
    "username": "destiny",
    "displayName": "Destiny"
  },
  "createdAt": "2026-08-31T02:38:37.000Z",
  "durationSeconds": 16,
  "views": 1576,
  "categories": [
    "Factorio"
  ],
  "isMature": false,
  "thumbnailUrl": "https://kick-prod-videos-30-day.s3.us-west-2.amazonaws.com/thumbnails/livestream/124925768/thumb0/video_thumbnail/thumb0.jpg?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAS3MDRZGPKNHGJGNE%2F20260925%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20260925T201911Z&X-Amz-SignedHeaders=host&X-Amz-Expires=300&X-Amz-Signature=05b620505a0cf74db59106faa2c138f76214d415800f9e80234a48e13f988365",
  "hlsUrl": "https://stream.kick.com/3c81249a5ce0/ivs/v1/196233775518/0PMYoN0I2p4i/2026/8/31/2/38/h507b6mByCG3/media/hls/master.m3u8",
  "file": {
    "downloadUrl": "https://api.apify.com/v2/key-value-stores/M8QqmhbCWHCe943YW/records/kick-vod-2155e45186f393dd515a7ce9bf261bad8d4d32436fa19a18645566cf259fd7d0.ts?signature=1pZzwl9IoG3baLNtSx42n",
    "rendition": "1920x1080",
    "mediaType": "video/MP2T",
    "sizeBytes": 13129920
  }
}
```

#### 💳 Pricing

This Actor uses pay-per-event pricing. The `Stored file` event is charged once for each supplied public VOD that is downloaded and stored successfully. Failed retrievals are not charged. The event price can vary by your Apify pricing tier, so see the Pricing tab for current rates. Metadata-only runs do not create a stored-file event.

#### 🔌 Integrations

Run the Actor in Apify Console or through the Apify API. Read the dataset with its API link, and use `file.downloadUrl` when a stored file is present. This video shows an Apify workflow:

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Can I submit a Kick clip or live-channel URL?

No. Submit full URLs for completed public Kick VODs. Clips, live-channel pages, category pages, shortened URLs, and other non-VOD sources are not supported.

##### What happens with a private or deleted VOD?

Private, deleted, pruned, subscriber-only, account-gated, encrypted, DRM-protected, or otherwise restricted media is not supported. The Actor reports a retrieval or storage problem when it cannot process a submitted VOD.

##### Can I resolve metadata without storing the media?

Yes. Choose `Resolve metadata`. The row includes VOD and channel fields, timing, views, categories, maturity, thumbnail, and HLS source when available, without a `file` object.

##### Can I choose the rendition or file size?

Yes. For download runs, choose `maxQuality` and optionally set `maxFileSizeMb`. If a VOD is larger than the limit, the run reports that condition. Leave the size field empty to allow any size and return all available results until the source is exhausted.

##### How many VOD URLs can one run accept?

You can submit up to 25 full public Kick VOD URLs in one run.

##### What happens when I submit the same VOD more than once?

The first eligible occurrence is saved. Later matches are ignored, and the saved row describes that first occurrence.

##### Does the Actor convert VODs to MP4?

No. It does not transcode or remux downloaded media into MP4 or another container. `file.mediaType` reports the media type of a stored file.

##### Is this a Kick VOD downloader browser extension?

No. It is an Apify Actor. Run it in Apify Console or through the Apify API with full public Kick VOD URLs.

### 📝 Changelog

**v0.0** (25-09-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~download-kick-vod/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Kick Streamer Scraper](https://apify.com/maximedupre/kick-streamers): Find public Kick channels and recent VOD summaries before you choose URLs to process.
- [Kick Clips](https://apify.com/maximedupre/kick-clips): Find or enrich public Kick clips when a VOD workflow also needs clip metadata.
- [Twitch Scraper](https://apify.com/maximedupre/twitch-scraper): Collect public Twitch VOD and stream metadata for a similar platform research workflow.
- [Dailymotion Video Downloader](https://apify.com/maximedupre/dailymotion-downloader): Resolve public Dailymotion video URLs when your source is outside Kick.
- [Rumble Video Downloader](https://apify.com/maximedupre/rumble-video-downloader): Get playable media links and details from public Rumble videos or Shorts.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

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

Choose whether to download each VOD or return its metadata without copying the media.

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

Choose the highest video resolution to use. Best available uses the highest rendition found for each VOD.

## `maxFileSizeMb` (type: `integer`):

Optionally set the largest stored file allowed, in megabytes. The result reports when a VOD is larger than this limit. For download runs, leave it empty to allow any size and return all available results until the source is exhausted.

## `vodUrls` (type: `array`):

Enter one or more full Kick VOD URLs. You can submit up to 25 URLs in one run. Other Kick pages and shortened URLs are not supported.

## Actor input object example

```json
{
  "resultType": "download",
  "maxQuality": "best",
  "vodUrls": [
    "https://kick.com/destiny/videos/62c42d7e-1420-4061-bb25-b209b190fc4a"
  ]
}
```

# Actor output Schema

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

Open the dataset with one row for each successful VOD result.

# 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 = {
    "resultType": "download",
    "vodUrls": [
        "https://kick.com/destiny/videos/62c42d7e-1420-4061-bb25-b209b190fc4a"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/download-kick-vod").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 = {
    "resultType": "download",
    "vodUrls": ["https://kick.com/destiny/videos/62c42d7e-1420-4061-bb25-b209b190fc4a"],
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/download-kick-vod").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "resultType": "download",
  "vodUrls": [
    "https://kick.com/destiny/videos/62c42d7e-1420-4061-bb25-b209b190fc4a"
  ]
}' |
apify call maximedupre/download-kick-vod --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/download-kick-vod"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/gDAbSZlhIEQHnjsmj/builds/teZyWrjzJ9rbQE0jS/openapi.json
