# VK Video Downloader (`maximedupre/vk-video-downloader`) Actor

Resolve public VK and VKVideo video or post URLs into direct source-hosted media links. Export video IDs, titles, authors, duration, thumbnails, engagement, quality variants, formats, and URL expiry hints for API, schedules, and integrations.

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

## Pricing

from $2.65 / 1,000 resolved videos

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 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.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.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/platform/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

### 📥 VK video downloader for direct media links

VK Video Downloader resolves public [VK](https://vk.com/) and [VKVideo](https://vkvideo.ru/) video or post URLs into direct source-hosted media links and clean metadata. Paste one or more known video or wall-post URLs, then export rows with video IDs, titles, authors, duration, thumbnails, engagement counts, quality variants, formats, and URL expiry hints when VK exposes them.

Use this VK video downloader when you already have public VK or VKVideo targets and need repeatable output for media review, content operations, archiving workflows, reporting, or an API pipeline. The Actor is focused on supplied video and post links. It does not search VK, crawl profiles, scrape comments, or save video files into Apify storage.

For a small first run, keep the prefilled VKVideo sample URL and start the Actor. Once the output shape fits your workflow, paste your own batch of public VK or VKVideo URLs, schedule the Actor, or call it through the Apify API.

### ✅ What this Actor does

- Accepts public `vkvideo.ru/video...` video URLs.
- Accepts public `vk.com/video...` video URLs.
- Accepts public `vk.com/wall...` post URLs when the post exposes an attached VK video.
- Saves one dataset row per successfully resolved public video.
- Returns direct source-hosted MP4 links and stream manifests when VK exposes them.
- Keeps quality labels, formats, dimensions, codecs, bitrates, and expiry timestamps when available.
- Adds titles, descriptions, authors, publish times, thumbnails, duration, and engagement counts when VK exposes them.
- Skips invalid, private, deleted, login-only, unsupported, unresolved, or no-media targets without saving placeholder rows.

You do not need VK cookies, a VK account, a VK API key, paid downloader credentials, or a browser extension. The Actor works with public videos that VK exposes without your login.

### 📦 Data you can export

Each output row represents one resolved public VK or VKVideo video. Fields include:

- `videoId` - stable VK owner/video identifier.
- `matchedInputs` - submitted video or post URLs that resolved to this row.
- `title` and `description` - visible video text when available.
- `author` - source-exposed uploader, profile, group, or channel details when available.
- `durationSeconds` and `publishedAt` - source video timing facts when exposed.
- `thumbnails` - source thumbnail image variants.
- `engagement` - public views, likes, reposts, and comments when VK exposes them.
- `media` - direct source-hosted media URLs and stream manifests with `type`, `format`, `quality`, dimensions, bitrate, codec, and `expiresAt` when available.

Open the dataset in Apify, export it as JSON, CSV, Excel, XML, RSS, or HTML, call it through the Apify API, schedule recurring runs, or connect results to webhooks and integrations.

### 🚀 How to run

1. Open the Actor input.
2. Paste one or more public VK or VKVideo video or post URLs in **Video or post URLs**.
3. Start the Actor.
4. Open the default dataset.
5. Use the `media` array to choose the quality or stream format your workflow needs.

The Actor pushes successful rows during the run, so you can inspect early results before a larger batch finishes. Duplicate URL forms that point to the same video are resolved into one video row with all matching inputs listed in `matchedInputs`.

### 🔧 Input

| Field | What to enter |
| ----- | ------------- |
| `videoUrls` | Public VK or VKVideo video URLs, plus public VK wall-post URLs that contain an attached video. |

Example input:

```json
{
	"videoUrls": [
		{
			"url": "https://vkvideo.ru/video-72701555_456239262"
		},
		{
			"url": "https://vk.com/video-72701555_456239262"
		},
		{
			"url": "https://vk.com/wall-72701555_2889"
		}
	]
}
````

Use direct video or post targets. For keyword discovery, use a VK video search scraper instead.

### 🧾 Output example

```json
{
	"videoId": "-72701555_456239262",
	"matchedInputs": [
		"https://vkvideo.ru/video-72701555_456239262"
	],
	"title": "Mountain bike highlights",
	"description": "Highlights from the weekend ride.",
	"author": {
		"id": "-72701555",
		"name": "VK Video",
		"url": "https://vk.com/public72701555"
	},
	"durationSeconds": 995,
	"publishedAt": "2025-06-20T14:30:00.000Z",
	"thumbnails": [
		{
			"url": "https://sun9-69.userapi.com/impg/example.jpg",
			"width": 1280,
			"height": 720
		}
	],
	"engagement": {
		"views": 6012,
		"likes": 44,
		"reposts": 5,
		"comments": 4
	},
	"media": [
		{
			"url": "https://vkvd196.okcdn.ru/?expires=1782309685951&sig=example",
			"type": "video",
			"format": "mp4",
			"quality": "1080p",
			"width": 1920,
			"height": 1080,
			"bitrate": 4500000,
			"codec": "h264",
			"expiresAt": "2026-06-24T10:01:25.951Z"
		}
	]
}
```

Nullable fields stay `null` when VK does not expose that fact for a public video. `media` always contains at least one source-backed media URL or stream manifest for saved rows.

### 💸 Pricing

This Actor uses pay-per-event pricing. You are charged `$0.00265` for each public VK or VKVideo video that is resolved and saved to the dataset, equal to `$2.65 per 1,000 resolved videos`.

Invalid, private, deleted, login-only, unsupported, unresolved, or no-media targets are reported in logs and do not create paid video events. There is no separate Actor-start charge.

### ⚠️ Limits and caveats

- The Actor works with public VK and VKVideo video or post URLs only.
- It does not search VK, scrape profiles, crawl groups, collect comments, or discover trending videos.
- It does not save, mirror, ZIP, or persist video/audio files into Apify storage.
- Direct media links are source-hosted VK/OK CDN URLs. They can expire or stop working when the source rotates signed URLs, so use them soon after the run.
- Different videos expose different quality variants, formats, engagement counts, and technical fields.
- Private, removed, login-only, restricted, unsupported, or no-video targets are skipped without dataset rows.

### ❓ FAQ

#### 🔐 Do I need VK cookies or a VK login?

No. The Actor is built for public VK and VKVideo videos and does not ask for cookies, account credentials, API keys, or browser extensions.

#### 💾 Does it download files into Apify storage?

No. It returns direct source-hosted media links and stream manifests. It does not create Apify-hosted copies, ZIP archives, permanent mirrors, or saved video files.

#### 🔎 Can it search VK videos by keyword?

No. This Actor resolves supplied video and post targets. Use [VK Videos Search Scraper](https://apify.com/maximedupre/vk-videos-search-scraper) when you need keyword or search URL discovery.

#### 📭 Why did one URL not create a row?

The Actor saves rows only when a public target resolves to a VK video with at least one source-backed media URL or stream manifest. Invalid, private, deleted, login-only, unsupported, or no-media targets are skipped and reported in the run log.

### 📝 Changelog

- 0.0: Initial release.

### 🆘 Support

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

### 🔗 Other actors

- [VK Videos Search Scraper ↗](https://apify.com/maximedupre/vk-videos-search-scraper) - Search public VK and VKVideo videos by keyword or search URL.
- [VK Posts Scraper ↗](https://apify.com/maximedupre/vk-posts-scraper) - Scrape public VK wall posts, authors, dates, engagement, media metadata, and source links.
- [Facebook Media Downloader ↗](https://apify.com/maximedupre/facebook-media-downloader) - Extract public Facebook video and reel media links, thumbnails, captions, and engagement.
- [TikTok Video Downloader ↗](https://apify.com/maximedupre/tiktok-video-downloader) - Download public TikTok videos or audio files from video URLs.
- [Pinterest Video Downloader ↗](https://apify.com/maximedupre/pinterest-video-downloader) - Extract public Pinterest pin video and image URLs with pinner, board, and media variant data.

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

# Actor input Schema

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

Public VK or VKVideo video or post URLs to resolve.

## Actor input object example

```json
{
  "videoUrls": [
    {
      "url": "https://vkvideo.ru/video-72701555_456239262"
    },
    {
      "url": "https://vk.com/video-22639630_456241862"
    },
    {
      "url": "https://vkvideo.ru/video-109707064_456239486"
    },
    {
      "url": "https://vkvideo.ru/video-82360088_456241927"
    },
    {
      "url": "https://vk.com/wall-72701555_2889"
    }
  ]
}
```

# Actor output Schema

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

Open one row per resolved public VK or VKVideo video with source identity, metadata, thumbnails, quality variants, and direct media links.

# 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": [
        {
            "url": "https://vkvideo.ru/video-72701555_456239262"
        },
        {
            "url": "https://vk.com/video-22639630_456241862"
        },
        {
            "url": "https://vkvideo.ru/video-109707064_456239486"
        },
        {
            "url": "https://vkvideo.ru/video-82360088_456241927"
        },
        {
            "url": "https://vk.com/wall-72701555_2889"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/vk-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": [
        { "url": "https://vkvideo.ru/video-72701555_456239262" },
        { "url": "https://vk.com/video-22639630_456241862" },
        { "url": "https://vkvideo.ru/video-109707064_456239486" },
        { "url": "https://vkvideo.ru/video-82360088_456241927" },
        { "url": "https://vk.com/wall-72701555_2889" },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/vk-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": [
    {
      "url": "https://vkvideo.ru/video-72701555_456239262"
    },
    {
      "url": "https://vk.com/video-22639630_456241862"
    },
    {
      "url": "https://vkvideo.ru/video-109707064_456239486"
    },
    {
      "url": "https://vkvideo.ru/video-82360088_456241927"
    },
    {
      "url": "https://vk.com/wall-72701555_2889"
    }
  ]
}' |
apify call maximedupre/vk-video-downloader --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "VK Video Downloader",
        "description": "Resolve public VK and VKVideo video or post URLs into direct source-hosted media links. Export video IDs, titles, authors, duration, thumbnails, engagement, quality variants, formats, and URL expiry hints for API, schedules, and integrations.",
        "version": "0.0",
        "x-build-id": "Xyby6MIo48s5TkGHA"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/maximedupre~vk-video-downloader/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-maximedupre-vk-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/maximedupre~vk-video-downloader/runs": {
            "post": {
                "operationId": "runs-sync-maximedupre-vk-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/maximedupre~vk-video-downloader/run-sync": {
            "post": {
                "operationId": "run-sync-maximedupre-vk-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 or post URLs",
                        "type": "array",
                        "description": "Public VK or VKVideo video or post URLs to resolve.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
