# VK Clips Scraper (`maximedupre/vk-clips`) Actor

Collect public VK Clips from recommendations, keywords, or Clip URLs. Save structured metadata, engagement counts, thumbnails, audio details, and temporary media links when VK provides them.

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

## Pricing

from $1.70 / 1,000 vk clips

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

### 🎬 Build a public VK Clips dataset

For social media researchers, trend analysts, content teams, and developers, this Actor collects public VK Clips from recommendations, keyword searches, or Clip URLs. It saves structured rows with clip links, titles or captions, publication details, creator context, engagement counts, thumbnails, audio data, and temporary MP4 or HLS links when VK provides them. Use the data to review trends, compare public engagement, or feed a dataset into your workflow. It also gives you VK Clips download links when VK returns temporary source links.

- Search public short videos by topic with [**VK Clips Search**](https://apify.com/maximedupre/vk-clips/examples/vk-clips-search).
- Collect public clip metadata in structured rows with [**VK Clips Scraper**](https://apify.com/maximedupre/vk-clips/examples/vk-clips-scraper).
- Review temporary source media links from public clips with [**Download VK Clips**](https://apify.com/maximedupre/vk-clips/examples/download-vk-clips).
- Resolve known public Clip URLs to media links and metadata with [**VK Clips Downloader**](https://apify.com/maximedupre/vk-clips/examples/vk-clips-downloader).
- Review available source links for public clips with [**VK Clips Download**](https://apify.com/maximedupre/vk-clips/examples/vk-clips-download).

#### 📦 Public VK Clip records

Each saved row represents one accepted public VK Clip. The row includes a stable clip ID, canonical URL, available title or caption, publication time, duration, dimensions, owner details, engagement counts, thumbnail data, temporary media links, audio-track data, and the first keyword that found it when keyword discovery is used.

If the same source clip appears again through another keyword or submitted URL, the Actor keeps the first eligible occurrence and ignores later matches. The saved row describes that first match only. Private, deleted, restricted, or otherwise unavailable public content is not collected.

#### 🚀 Find clips your way

Choose one discovery method for each run:

- **Recommendations** collects current public clips from VK's recommendation feed.
- **Keywords** searches public clips for one or more terms in one keyword run.
- **Clip URLs** refreshes current public metadata for submitted public Clip URLs. Unavailable clips are skipped so other submitted URLs can continue.

Set engagement minimums when you want to keep clips above selected public view, like, comment, or repost counts. Set **Maximum clips** to a positive number when you want a bounded run. Leave it empty to return all available results until the source is exhausted.

#### ⚙️ Input

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `discoveryMethod` | string | Chooses `recommendations`, `keywords`, or `clipUrls`. |
| `keywords` | array of strings | Enter one or more words or phrases for public VK Clip search. Use a separate run for a different search setup. |
| `clipUrls` | array of objects | Enter one or more public VK Clip URLs. Each object contains a `url` value. The Actor refreshes current public metadata for each URL. |
| `clipUrls[].url` | URL string | Public VK Clip URL to refresh. |
| `maxItems` | integer, optional | Sets the maximum number of accepted clips saved by the run. Leave it empty to return all available results until the source is exhausted. |
| `filters` | object, optional | Holds the minimum public engagement counts to apply. Leave a filter field empty to skip that filter. |
| `filters.minViews` | integer, optional | Keeps clips with at least this many public views. |
| `filters.minLikes` | integer, optional | Keeps clips with at least this many public likes. |
| `filters.minComments` | integer, optional | Keeps clips with at least this many public comments. |
| `filters.minReposts` | integer, optional | Keeps clips with at least this many public reposts. |

`keywords` is used with `discoveryMethod` set to `keywords`. `clipUrls` is used with `discoveryMethod` set to `clipUrls`. The selected method determines which method-specific field is shown.

**Example input**

This is the smallest public input from a successful current-beta run:

```json
{
  "discoveryMethod": "recommendations",
  "maxItems": 100
}
```

#### 🧾 Output

**Run output**

| Field | Type | What it does |
| --- | --- | --- |
| `datasetItems` | string | Opens saved public VK Clips in the default dataset. |

**Dataset rows**

Each dataset row uses one shape. Optional fields appear when VK provides them. The required top-level fields are `clipId`, `clipUrl`, and `owner`.

| Field | Type | What it does |
| --- | --- | --- |
| `clipId` | string | Stable identifier of the public VK Clip. |
| `clipUrl` | URL string | Canonical public URL of the VK Clip. |
| `title` | string, optional | Public title of the clip when VK provides one. |
| `description` | string, optional | Public description or caption of the clip when VK provides one. |
| `publishedAt` | ISO date-time string, optional | Date and time when the clip was published, when VK provides it. |
| `durationSeconds` | integer, optional | Length of the clip in seconds when VK provides it. |
| `dimensions` | object, optional | Source dimensions of the clip in pixels. |
| `dimensions.width` | integer | Source width in pixels. |
| `dimensions.height` | integer | Source height in pixels. |
| `owner` | object | Public creator or community that owns the clip. It always includes `id`, `type`, and `name`. |
| `owner.id` | string | Stable identifier of the public creator or community. |
| `owner.type` | string | Owner type: `user` or `community`. |
| `owner.name` | string | Public name of the creator or community. |
| `owner.handle` | string, optional | Public handle when VK provides one. |
| `owner.profileUrl` | URL string, optional | Public profile URL when VK provides one. |
| `owner.avatarUrl` | URL string, optional | Public avatar image URL when VK provides one. |
| `owner.followersCount` | integer, optional | Public follower count of the creator when VK provides it. |
| `owner.membersCount` | integer, optional | Public member count of the community when VK provides it. |
| `engagement` | object, optional | Public engagement counts for the clip when VK provides them. |
| `engagement.views` | integer, optional | Public view count. |
| `engagement.likes` | integer, optional | Public like count. |
| `engagement.comments` | integer, optional | Public comment count. |
| `engagement.reposts` | integer, optional | Public repost count. |
| `thumbnail` | object, optional | One public thumbnail or preview image when available. It includes `url`. |
| `thumbnail.url` | URL string | Direct public URL of the clip thumbnail or preview image. |
| `thumbnail.width` | integer, optional | Thumbnail width in pixels when VK provides it. |
| `thumbnail.height` | integer, optional | Thumbnail height in pixels when VK provides it. |
| `thumbnailVariants` | array of objects, optional | Public thumbnail sizes exposed by VK. |
| `thumbnailVariants[].url` | URL string | Direct public URL of a thumbnail size. |
| `thumbnailVariants[].width` | integer, optional | Width of that thumbnail in pixels. |
| `thumbnailVariants[].height` | integer, optional | Height of that thumbnail in pixels. |
| `media` | object, optional | Temporary public MP4 and HLS links returned by VK. |
| `media.mp4` | array of objects, optional | Temporary public MP4 links in the qualities returned by VK. |
| `media.mp4[].url` | URL string | Direct temporary public MP4 URL for a quality. |
| `media.mp4[].quality` | string, optional | Quality label returned by VK. |
| `media.hls` | array of objects, optional | Temporary public HLS links in the qualities returned by VK. |
| `media.hls[].url` | URL string | Direct temporary public HLS URL for a quality. |
| `media.hls[].quality` | string, optional | Quality label returned by VK. |
| `audioTrack` | object, optional | Associated public audio-track information when VK exposes it. |
| `audioTrack.id` | string, optional | Stable identifier of the associated audio track when VK provides it. |
| `audioTrack.title` | string, optional | Public title of the associated audio track. |
| `audioTrack.artist` | string, optional | Public artist name of the associated audio track. |
| `matchedKeyword` | string, optional | The keyword that first produced this clip during keyword discovery. |

**Example dataset row**

This is a shortened genuine row from the successful current-beta recommendation run. The `thumbnailVariants` and `media` arrays are shown as `"..."` to keep the example short. All other shown values are from that public dataset row.

```json
{
  "clipId": "-230258621_456239058",
  "clipUrl": "https://vk.com/clip-230258621_456239058",
  "owner": {
    "id": "-230258621",
    "type": "community",
    "name": "Dasha Shulgina",
    "handle": "shulginadashuk",
    "profileUrl": "https://vk.com/shulginadashuk",
    "avatarUrl": "https://sun1-94.userapi.com/s/v1/ig2/szOKSZI2Q-XbHqT0SNWrXtzRoe_jU9ZAapYarzNZhK-c3D2suRZV4eVgpwV1bPzrWkhy6Rtxhdy4yu0BIKpQxsCA.jpg?quality=95&crop=49,110,768,768&as=32x32,48x48,72x72,108x108,160x160,240x240,360x360,480x480,540x540,640x640,720x720&ava=1&u=eEDo7cdelW-p3nOaPNTj0vcN8Q1jYb3zpWaWxZaau_Y&cs=100x100"
  },
  "title": "Clip by @shulginadashuk",
  "publishedAt": "2026-03-23T19:41:33.000Z",
  "durationSeconds": 59,
  "dimensions": {
    "width": 480,
    "height": 852
  },
  "engagement": {
    "views": 689794,
    "likes": 15610,
    "comments": 71,
    "reposts": 197
  },
  "thumbnail": {
    "url": "https://sun9-68.userapi.com/impg/h7z71GXjT1uf2FqRw4FIOBtbk0My_SQ5dK8zrA/YfM3THXc-Tc.jpg?size=130x96&quality=95&keep_aspect_ratio=1&background=000000&sign=ddc5a22711efa81c76f44c4ab40502fc&c_uniq_tag=JMZjmg6Ir4gFdoRUh1OIyhQCHTOPy1NNLl89IrJSeYE&type=video_thumb",
    "width": 130,
    "height": 96
  },
  "thumbnailVariants": "...",
  "media": {
    "mp4": "...",
    "hls": "..."
  },
  "audioTrack": {
    "id": "456239042",
    "title": "Original sound"
  }
}
```

#### 💳 Pricing

This Actor uses pay-per-event pricing. You are charged for each accepted public VK Clip saved to the default dataset. See the Pricing tab for the current tier price. The event is based on saved clips, not a fixed run size.

#### 🔌 Integrations

Open the saved dataset in Apify or read its rows through the Apify API. Use the structured fields and source links in your own review or data workflow. The MP4 and HLS links remain temporary links supplied by VK when available.

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

#### ❓ FAQ

##### Can I collect private or deleted VK Clips?

No. The Actor collects public VK Clips that the source makes available without bypassing access controls. Private, deleted, restricted, and login-only content is outside its scope.

##### What happens when a Clip matches more than one keyword or URL?

The first eligible occurrence is saved. Later matches for the same source clip are ignored, and the saved row describes the first match only. In keyword mode, `matchedKeyword` shows the keyword that first produced it.

##### Can one run use recommendations, keywords, and Clip URLs together?

No. Choose one discovery method for a run. Use separate runs for different discovery setups.

##### Do the media links host the videos permanently?

No. The Actor does not permanently host or mirror video files. It keeps temporary public MP4 and HLS links when VK exposes them.

##### What happens when I leave Maximum clips empty?

The run returns all available results until the source is exhausted, subject to the selected discovery method and filters.

##### How do engagement filters work?

Set a minimum for any combination of views, likes, comments, and reposts. A clip must meet each minimum you set to be accepted.

### 📝 Changelog

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

- Initial release.

### 🆘 Support

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

### 🔗 Related Actors

- [**VK Videos Search Scraper**](https://apify.com/maximedupre/vk-videos-search-scraper) searches broader public VK and VKVideo video results by keyword.
- [**VK Video Downloader**](https://apify.com/maximedupre/vk-video-downloader) resolves known public VK or VKVideo URLs into source media links and metadata.
- [**TikTok Search Scraper**](https://apify.com/maximedupre/tiktok-search-results-scraper) searches public TikTok videos or creator profiles by keyword.
- [**YouTube Shorts Downloader**](https://apify.com/maximedupre/youtube-shorts-downloader) turns known public Shorts URLs into source media links and metadata.
- [**VK Clips Search Scraper 🎥**](https://apify.com/easyapi/vk-clips-search-scraper) searches public VK Clips by keyword with engagement and media data.

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

# Actor input Schema

## `discoveryMethod` (type: `string`):

Choose one way to find clips. Recommendations use VK's current recommendation feed, Keywords search public clips by terms, and Clip URLs refresh known public clips.

## `keywords` (type: `array`):

Enter one or more words or phrases. The Actor finds public VK Clips that match these terms. Separate searches need separate runs.

## `clipUrls` (type: `array`):

Enter one or more public VK Clip URLs. The Actor refreshes current public metadata for each URL. Unavailable clips are skipped so other submitted URLs can continue.

## `maxItems` (type: `integer`):

Set a positive limit to stop after that many accepted clips. Leave it empty to return all available results until the source is exhausted.

## `filters` (type: `object`):

Set a minimum public count for any metric you want to filter. Leave a field empty to skip that filter.

## Actor input object example

```json
{
  "discoveryMethod": "recommendations",
  "maxItems": 100
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

Open saved public VK Clips in 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 = {
    "discoveryMethod": "recommendations",
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/vk-clips").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 = {
    "discoveryMethod": "recommendations",
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/vk-clips").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 '{
  "discoveryMethod": "recommendations",
  "maxItems": 100
}' |
apify call maximedupre/vk-clips --silent --output-dataset

```

## MCP server setup

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

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/EjiWmwNuPvj4D872z/builds/UBR0KDydQ8aG1Pp67/openapi.json
