# VK Video Scraper – Search, Channels & MP4 (`funny_ground/vk-video-scraper`) Actor

Scrape public VK Video and VK Clips by URL, channel, playlist, or keyword. Get metadata, engagement, subtitles, and downloadable MP4/HLS URLs.

- **URL**: https://apify.com/funny\_ground/vk-video-scraper.md
- **Developed by:** [Coor Yu](https://apify.com/funny_ground) (community)
- **Categories:** Videos, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 1,000 vk video results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## VK Video Scraper API — Channels, Search & Downloads

Scrape public videos from **VK**, **VKontakte**, and **VKVideo.ru** without a login. Use one Actor for channel/community videos, keyword search, direct videos, clips, playlists, exact engagement counts, thumbnails, subtitles, and optional MP4 or cover downloads.

The Actor uses the anonymous HTTP flow used by VK Video's public web client. Normal runs start no browser and no proxy, keeping compute and bandwidth low.

> **Result policy:** a complete run with 0 valid public videos finishes as `FAILED`. When at least one row is saved, private/deleted/empty inputs become warnings unless `failOnPartialFailure` is enabled.

### Quick start

Paste mixed VK URLs and let the Actor route them automatically:

```json
{
  "startUrls": [
    { "url": "https://vkvideo.ru/@club228512875/all" },
    { "url": "https://vkvideo.ru/?q=%D0%BA%D0%BE%D1%82%D0%B8%D0%BA%D0%B8" },
    { "url": "https://vkvideo.ru/video-228512875_456239081" },
    { "url": "https://vkvideo.ru/clip-125504191_456260941" }
  ],
  "resultsPerInput": 5,
  "includeClips": true,
  "shouldDownloadVideos": false,
  "shouldDownloadCovers": false
}
```

Or use dedicated input fields:

```json
{
  "channels": ["kinopix", "club228512875"],
  "searchKeywords": ["котики", "искусственный интеллект"],
  "videoUrls": ["https://vk.com/video-228512875_456239081"],
  "resultsPerInput": 50
}
```

Start with 5 results and downloads disabled to validate your inputs at minimum cost.

### Supported inputs

- VKVideo channel tabs such as `https://vkvideo.ru/@channel/all` and `/clips`
- Bare screen names such as `kinopix` or `club228512875`
- Legacy VK owner pages such as `https://vk.com/videos-228512875`
- VK and VKVideo direct video URLs (`video-OWNER_ID_VIDEO_ID`)
- VK Clip URLs (`clip-OWNER_ID_VIDEO_ID`)
- Search keywords in Cyrillic or Latin characters
- Search URLs containing a `q` parameter
- Public catalog and playlist URLs exposed by VK Video

Duplicate inputs and duplicate videos across sources are removed before dataset billing.

### Output

Each dataset row represents one public video or clip:

```json
{
  "videoId": "-228512875_456239081",
  "ownerId": "-228512875",
  "webVideoUrl": "https://vkvideo.ru/video-228512875_456239081",
  "title": "Video title",
  "description": "Video description",
  "createTimeISO": "2026-01-03T12:00:00.000Z",
  "duration": 2009,
  "videoType": "video",
  "width": 1920,
  "height": 1080,
  "videoDownloadUrl": "https://...temporary-signed-media-url...",
  "mediaExpiresAt": "2026-09-20T12:00:00.000Z",
  "videoUrls": {
    "mp4_1080": "https://...",
    "mp4_720": "https://...",
    "hls": "https://..."
  },
  "availableQualities": ["1080p", "720p", "480p", "360p", "240p", "144p"],
  "coverUrl": "https://...",
  "author": {
    "id": "-228512875",
    "type": "community",
    "screenName": "club228512875",
    "name": "Channel name",
    "verified": true,
    "followers": 46550,
    "avatar": "https://..."
  },
  "stats": {
    "viewCount": 282409,
    "likeCount": 2565,
    "commentCount": 37,
    "repostCount": 37
  },
  "hashtags": [],
  "mentions": [],
  "subtitles": [],
  "sourceType": "direct",
  "sourceInput": "https://vkvideo.ru/video-228512875_456239081",
  "scrapedAt": "2026-09-15T12:00:00.000Z"
}
```

Fields that VK does not expose for a particular video are omitted rather than guessed. Counts are exact integer snapshots from VK's response.

### Media downloads

Metadata rows include every exposed MP4/HLS/DASH variant and select the requested quality as `videoDownloadUrl`. These signed URLs are temporary and can be tied to the requesting IP.

Set `shouldDownloadVideos: true` when you need a durable MP4 in the run's Key-Value Store. The Actor downloads the preferred MP4 (up to 4K when available), stores it under `storedVideoKey`, and preserves the metadata row if the file is too large or unavailable. `maxDownloadMegabytes` prevents an unexpectedly large video from exhausting memory or storage.

Downloads increase runtime, storage, network use, and platform charges. They are disabled by default.

### Main options

| Field | Default | Purpose |
|---|---:|---|
| `startUrls` | `[]` | Auto-detected mixed VK/VKVideo URLs |
| `channels` | `[]` | Channel names, owner IDs, or owner URLs |
| `searchKeywords` | `[]` | VK Video keyword searches |
| `videoUrls` | `[]` | Direct video or clip URLs |
| `resultsPerInput` | `50` | Maximum rows per channel/catalog/search; `0` follows the feed to its end/safety limit |
| `includeClips` | `true` | Keep short-video rows in mixed search/catalog results |
| `shouldDownloadVideos` | `false` | Store selected MP4 files |
| `videoQuality` | `best` | `best`, `2160`, `1440`, `1080`, `720`, `480`, `360`, `240`, or `144` |
| `shouldDownloadCovers` | `false` | Store the largest exposed thumbnail |
| `maxPagesPerInput` | `100` | Hard pagination safety guard |
| `failOnPartialFailure` | `false` | Fail the run when any individual input is empty/invalid |

### Pricing

- **Free plan:** $0.00225 per result — $2.25 per 1,000
- **Bronze:** $0.00045 per result — $0.45 per 1,000
- **Silver and above:** $0.00040 per result — $0.40 per 1,000
- Actor start: $0.0005
- Standard Apify platform usage is billed separately to the user
- Only rows actually written to the default dataset incur the result fee

Apify Free-plan users can receive up to **50 dataset rows per run** across all inputs. Paid-plan users do not have this developer-set 50-row cap.

### API example

```bash
curl -X POST "https://api.apify.com/v2/acts/funny_ground~vk-video-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchKeywords":["котики"],"resultsPerInput":5}'
```

### Русский

Actor собирает публичные видео VK и VKVideo без авторизации: видео каналов и сообществ, поиск по ключевым словам, отдельные видео и клипы, статистику, обложки, субтитры и временные ссылки MP4/HLS. Для первого запуска укажите `resultsPerInput: 5` и оставьте скачивание файлов выключенным.

### 中文

本 Actor 无需登录即可抓取公开 VK/VKVideo 频道视频、关键词搜索结果、单视频与 Clips，并输出作者、互动数、封面、字幕和多清晰度媒体链接。建议先用 `resultsPerInput: 5`、关闭下载做低成本验证。

### Limitations and responsible use

- Public content only; private, deleted, geo-blocked, age-restricted, or login-only items may be unavailable.
- VK can change its public web responses without notice. The Actor validates response shapes and fails visibly instead of returning fabricated rows.
- Signed media URLs expire and may be IP-bound; enable file storage when a durable copy is authorized and required.
- Search ranking and channel feeds are snapshots and can change between runs.
- Respect applicable law, copyright, privacy, and VK's terms. Do not use the Actor to bypass access controls.

### Related Actors

- [TikTok Scraper API — Video, Profile, Hashtag & Search](https://apify.com/funny_ground/tiktok-scraper)
- [Instagram Reels & Video Scraper](https://apify.com/funny_ground/instagram-video-scraper)
- [YouTube Scraper API — Channels, Shorts & Playlists](https://apify.com/funny_ground/youtube-scraper)

# Actor input Schema

## `startUrls` (type: `array`):

Mix VK or VKVideo channel, direct-video, clip-tab, playlist, and search URLs. The Actor routes each URL automatically.

## `channels` (type: `array`):

VK Video channel names, VK screen names, numeric owner IDs, or full profile/community/channel URLs. Bare channel names scrape the Videos tab; append /clips to a VKVideo URL to scrape clips.

## `searchKeywords` (type: `array`):

Free-text VK Video searches. Cyrillic and Latin queries are supported.

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

Public vk.com or vkvideo.ru video URLs containing a VK owner ID and video ID.

## `resultsPerInput` (type: `integer`):

Maximum videos returned for each channel, catalog URL, or keyword. Direct video URLs return one row. Set to 0 to continue until the feed ends or maxPagesPerInput is reached. A separate global 50-row cap applies to Apify Free-plan runs.

## `includeClips` (type: `boolean`):

Include short\_video rows when a search or catalog response contains clips. Explicit /clips channel URLs are always respected.

## `failOnPartialFailure` (type: `boolean`):

If false, valid rows are preserved and the run succeeds with warnings when another input is private, deleted, empty, or unsupported. If true, any partial failure marks the run FAILED.

## `shouldDownloadVideos` (type: `boolean`):

Store the selected MP4 in the run Key-Value Store. This can greatly increase runtime, storage, and platform usage. Metadata already includes temporary direct media URLs when VK exposes them.

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

Preferred MP4 quality. Best selects the highest available MP4; if a requested quality is unavailable, the next-best MP4 is used.

## `shouldDownloadCovers` (type: `boolean`):

Store the largest exposed thumbnail in the run Key-Value Store.

## `maxDownloadMegabytes` (type: `integer`):

Safety limit for each optional video download. Files larger than this are skipped while their metadata row is preserved.

## `downloadConcurrency` (type: `integer`):

Maximum simultaneous optional video or cover downloads.

## `maxPagesPerInput` (type: `integer`):

Hard pagination guard, including the first page. Increase only for large paid-plan exports.

## `requestTimeoutSecs` (type: `integer`):

Timeout for each VK API or optional media request.

## `maxRequestRetries` (type: `integer`):

Retries for transient rate limits, network failures, and VK server errors.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://vkvideo.ru/video-228512875_456239081"
    },
    {
      "url": "https://vkvideo.ru/?q=%D0%BA%D0%BE%D1%82%D0%B8%D0%BA%D0%B8"
    }
  ],
  "channels": [
    "kinopix",
    "club228512875",
    "https://vkvideo.ru/@vkvideo/all"
  ],
  "searchKeywords": [
    "котики",
    "artificial intelligence"
  ],
  "videoUrls": [
    "https://vkvideo.ru/video-228512875_456239081"
  ],
  "resultsPerInput": 5,
  "includeClips": true,
  "failOnPartialFailure": false,
  "shouldDownloadVideos": false,
  "videoQuality": "best",
  "shouldDownloadCovers": false,
  "maxDownloadMegabytes": 250,
  "downloadConcurrency": 2,
  "maxPagesPerInput": 100,
  "requestTimeoutSecs": 30,
  "maxRequestRetries": 2
}
```

# Actor output Schema

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

Scraped VK videos from the default dataset.

# 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 = {
    "startUrls": [
        {
            "url": "https://vkvideo.ru/@club228512875/all"
        }
    ],
    "resultsPerInput": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("funny_ground/vk-video-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 = {
    "startUrls": [{ "url": "https://vkvideo.ru/@club228512875/all" }],
    "resultsPerInput": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("funny_ground/vk-video-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 '{
  "startUrls": [
    {
      "url": "https://vkvideo.ru/@club228512875/all"
    }
  ],
  "resultsPerInput": 5
}' |
apify call funny_ground/vk-video-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,funny_ground/vk-video-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/U0GeCggj339pSiF3I/builds/GsAH2Zku7hPeSYwLn/openapi.json
