# Kick VOD Scraper (`romy/kick-vod-scraper`) Actor

Fetch every saved VOD for one or more Kick channels, one row per video, optionally with full per-VOD detail (category, thumbnails, viewer stats, live status). Accepts a numeric channel id or slug (auto-resolved). No login or API key needed. Split from romy/kick-all-in-one-api into a focused Actor.

- **URL**: https://apify.com/romy/kick-vod-scraper.md
- **Developed by:** [Romy](https://apify.com/romy) (community)
- **Categories:** Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.10 / 1,000 vod fetcheds

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

### What does Kick VOD Scraper do?

**Kick VOD Scraper** takes one or more Kick channel ids or slugs and pushes every saved VOD (video-on-demand) for that channel, one dataset row per VOD, optionally enriched with full per-VOD detail (category, thumbnail set, viewer stats, live status).

It talks directly to the same internal API the official [Kick](https://kick.com/) Android app uses (`mobile.kick.com`, `kick.com`), reverse-engineered by capturing and analyzing live traffic from the real app. No Kick account, no API key. This is the VOD slice of [Kick All-in-One API](https://apify.com/romy/kick-all-in-one-api), split out as its own focused Actor.

### Why use Kick VOD Scraper?

- **Accepts a channel slug or numeric id** — pass either `"kaneljoseph"` or `"18750821"`; slugs are resolved to the numeric id automatically (the underlying videos endpoint needs the numeric id, confirmed live)
- **Optional full detail per VOD in parallel** — one extra call per VOD, fetched concurrently, not sequentially
- **No account needed** — every request works fully anonymously
- **Use cases:** VOD archival/indexing, content research, building a channel's video history for analytics

### Input

| Field           | Type     | Description                                                              |
| --------------- | -------- | ------------------------------------------------------------------------ |
| `channelIds`    | string\[] | **Required.** Each entry is a numeric Kick channel id or a channel slug. |
| `includeDetail` | boolean  | Fetch full per-VOD detail via an extra call per video. Default `true`.   |

Example:

```json
{
    "channelIds": ["kaneljoseph", "18750821"],
    "includeDetail": true
}
```

### Output

One dataset row per VOD:

```json
{
    "channelId": 18750821,
    "sourceIdentifier": "kaneljoseph",
    "video": {
        "id": "01a04b02-d928-7657-aa48-6b98184d5b10",
        "title": "IT TAKES TWO MARATHON WITH SUKI MELLOW...",
        "duration": 154507,
        "start_time": "2026-08-29T00:54:33Z",
        "thumbnail": { "src": "https://images.kick.com/video_thumbnails/.../720.webp" }
    },
    "detail": { "...": "full videoDetail response, present only if includeDetail is true" }
}
```

### Known limitations

- **This endpoint has no pagination of any kind, confirmed live** by the parent Actor's own testing of every plausible param name (`page`, `cursor`, `after`, `offset`, `limit`) — every one was silently ignored. It always returns the same up-to-30 most recent VODs for a channel. This is a real Kick backend limitation, not a gap in this Actor, so no `maxPages`/`maxItems` input exists here.
- A channel with zero VODs pushes no rows for that channel id (logged, not an error).
- This is an unofficial, reverse-engineered integration, not affiliated with or endorsed by Kick Streaming, Inc.

### Pricing

Pay-per-event. You are charged a `video` event ($0.004 on the FREE tier) for each VOD row pushed. See the Actor's Pricing tab for current rates.

# Actor input Schema

## `channelIds` (type: `array`):

Each entry can be EITHER a numeric Kick channel id (e.g. "18750821") OR a channel slug (e.g. "kaneljoseph"). Slugs are automatically resolved to numeric ids first, since the underlying videos endpoint requires the numeric id.

## `includeDetail` (type: `boolean`):

Fetch full detail (category, thumbnail, viewer stats, etc.) for every VOD returned, via a parallel call per video. Turn off for a faster, lighter-weight run using only the summary fields already in the video list.

## Actor input object example

```json
{
  "channelIds": [
    "kaneljoseph"
  ],
  "includeDetail": true
}
```

# 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 = {
    "channelIds": [
        "kaneljoseph"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("romy/kick-vod-scraper").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 = { "channelIds": ["kaneljoseph"] }

# Run the Actor and wait for it to finish
run = client.actor("romy/kick-vod-scraper").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 '{
  "channelIds": [
    "kaneljoseph"
  ]
}' |
apify call romy/kick-vod-scraper --silent --output-dataset

```

## MCP server setup

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

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/pc5CF1qRXaJM4VmAV/builds/WPFtRlbycFZ1g40oe/openapi.json
