# Yandex Video Scraper (`apt_marble/yandex-video-scraper`) Actor

Search video across many platforms at once. One search term returns videos from YouTube, Rutube, VK Video, OK and more in a single table, with title, address, platform, length, channel, thumbnail and — where published — views and publication date. Find re-uploads and size a topic fast.

- **URL**: https://apify.com/apt\_marble/yandex-video-scraper.md
- **Developed by:** [Hamza](https://apify.com/apt_marble) (community)
- **Categories:** Videos, SEO tools, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 video founds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Yandex Video Scraper

Search video the way the Russian-speaking internet searches it — across many video platforms at once. One search term gives you videos from YouTube, Rutube, VK Video, OK, Mail.ru and other platforms side by side in a single table, each with its title, its address on the platform it lives on, how long it is, the channel behind it, a thumbnail and, where published, a view figure and a publication date. It is built for media monitoring teams, brand-safety and rights-holder teams hunting re-uploads, and content strategists sizing a topic across platforms rather than inside one of them.

### What you can do with it

- **See a whole topic across platforms in one table.** One search term, one table, several video platforms — no need to work through each platform separately and stitch the answers together.
- **Find where a video has been re-posted.** Switch on "Include the same video found on other platforms" and every copy of a video comes back as its own row, grouped with the original, so re-uploads are visible at a glance.
- **Track re-uploads of your own content.** Search your brand, show or campaign name and see which platforms are carrying it and who posted it.
- **Size a topic before you commission it.** Length, channel, view figure and publication date across hundreds of videos tell you what already exists and how it performed.
- **Build a video dataset for research or training.** Up to roughly 960 distinct videos for a single search term, deduplicated, with stable columns.
- **Watch a competitor's video footprint.** Search their brand or product names and see what is out there, on which platform, and from which channel.

### What you get

One row per video. A shortened real record:

```json
{
  "query": "кошки",
  "position": 1,
  "title": "Котята, плывущие рядом с матерью — видео с кошками и животными",
  "videoUrl": "http://vk.com/video-125504191_456289748",
  "platform": "VK Видео",
  "platformDomain": "vk.com",
  "durationSeconds": 605,
  "durationText": "10:05",
  "viewCountText": "28K",
  "viewCountApprox": 28000,
  "publishedAt": "2025-08-13T16:22:01.000Z",
  "publishedDateText": "13 Aug 2025",
  "channelName": "Кошки, котики, котята",
  "channelUrl": null,
  "channelIsVerified": false,
  "thumbnailUrl": "https://avatars.mds.yandex.net/get-vthumb/3504590/c0e45369d2f1fa5660bc0aa936a0a04b/564x318_1",
  "description": "Смотрите онлайн «Котята, плывущие рядом с матерью» от автора Кошки, котики, котята…",
  "isAlternateSource": false,
  "resultGroupId": "7310699443916662657",
  "collectedAt": "2026-08-17T10:24:02.118Z"
}
```

### Input reference

| Field | Type | Default | What it does |
| --- | --- | --- | --- |
| `queries` | list of text | — (required) | What to search for. One row is produced for every video found. Terms in Russian give the fullest results, because this covers the Russian-speaking video market, but any language works. Up to 200 terms in one run. |
| `maxResultsPerQuery` | number | `50` | How many videos to collect for each search term, up to 1000. The source publishes roughly 960 distinct videos for any one search, so anything above that returns what it makes available. |
| `duration` | choice | `any` | Restrict results by how long the videos are: any length, short, medium or long. |
| `region` | choice | no preference | The market to lean the results towards: Russia, Moscow or Saint Petersburg. This nudges which videos rank highest; it is not a strict filter. |
| `includeAlternateSources` | yes/no | `no` | Also return each copy of a video that the source found on another platform, as its own row grouped with the original. |
| `parallelSearches` | number | `3` | How many search terms to work through at the same time, up to 10. Higher is faster on large jobs. |

### Output fields

| Field | What it is |
| --- | --- |
| `query` | The search term this video was found for |
| `position` | Where the video came in the results, counting from 1 |
| `title` | The video's title |
| `videoUrl` | The video's address on the platform it lives on |
| `embedUrl` | The address of the embeddable player, where the platform offers one |
| `platform` | The platform the video is on, as the source names it |
| `platformDomain` | The platform's site |
| `durationSeconds` | How long the video is, in seconds |
| `durationText` | How long the video is, as shown to a viewer |
| `viewCountText` | The view figure exactly as published — empty when none is published |
| `viewCountApprox` | The same figure as a number you can sort by. It is the published, rounded figure, not an exact total |
| `publishedAt` | When the video was published, as a full date and time |
| `publishedDateText` | The publication date as the source prints it — empty when none is printed |
| `channelName` | The channel or account that posted it |
| `channelUrl` | The channel's own address. The source publishes this for YouTube results only, so it is empty on everything else |
| `channelIsVerified` | Whether the platform marks the channel as verified — empty when the video has no channel behind it at all |
| `thumbnailUrl` | A still image for the video |
| `description` | The description shown beside the video |
| `isAlternateSource` | `true` when this row is a copy of another row's video found on a different platform |
| `resultGroupId` | Shared by a video and every copy of it, so copies group with their original |
| `requestedRegionId`, `requestedRegionName`, `durationFilter` | What the run asked for, recorded on every row |
| `videoId` | The video's identifier, stable within a run |
| `collectedAt` | When the row was collected |

### Pricing

You pay per video. There is no charge for starting a run, no charge for a search that finds nothing, and no separate charge for anything else.

| What is charged | Price |
| --- | --- |
| Video found | $0.001 each — that is $1.00 per 1,000 videos |

**Worked example.** Ten search terms, 50 videos each, is 500 videos and costs **$0.50**. Taking one broad search term to its full depth is roughly 960 videos and costs about **$0.96**.

Copies of a video found on other platforms are ordinary rows and are charged at the same price — they are only produced when you switch them on.

### Limits & what this actor cannot do

- **Results are a snapshot** taken at the moment of collection. The source's own results change continuously, and the same search run tomorrow will not be identical.
- **There is a ceiling per search term.** The source publishes roughly 960 distinct videos for any one search, however broad the term. Asking for more returns what it makes available, and repeated videos are reported once rather than padding the count.
- **Not every video publishes a view figure or a publication date.** In measurement, about one video in five carried no view figure at all. Where the source publishes nothing, the column comes back **empty — never as a zero and never as a guess**. A zero would look like a real measurement and it would be wrong.
- **View figures are rounded by the source**, which publishes them as "209.9K" or "6.4 mln" and never as an exact total. Both the published wording and a number you can sort by are given, and neither should be read as exact.
- **Not every video publishes a channel.** In measurement about one video in seven had no channel behind it at all: for those, the channel name, the channel address and the verified marker all come back empty. A video with no channel is never reported as having an unverified one.
- **An address for the channel itself is published for YouTube results only.** In measurement it was present on 16 of 111 videos, every one of them on YouTube, and empty on every video from every other platform. Plan around the channel *name*, which is published across all of them, rather than around the channel address.
- **A thumbnail and a description are usual but not guaranteed.** In measurement each was present on roughly nine videos in ten, and absent ones are left empty.
- **Subscriber counts, transcripts, tags and licensing information are not published on this surface** and so cannot be returned.
- **Likes and comment counts are deliberately not returned, even though the source carries a figure for them.** The figures it carries count reactions and comments left on the source's *own* player page, not on the platform hosting the video: they were present on well under half the videos, and ran to a few dozen at most beside view figures in the hundreds of thousands. Publishing them in a column called "likes" or "comments" would read as the platform's engagement and be wrong by orders of magnitude, so they are left out.
- **Copies on other platforms are uncommon, and they carry less detail.** Switching the option on does not roughly double the table. In measurement across six searches and 210 ranked videos, the source named a copy on another platform for only 6 of them — about 3 extra rows per hundred. A copy also arrives with less around it than a ranked result: its address, platform, length, channel and view figure are published, but its thumbnail and description often are not, because the source only carries those for the videos it ranks. Use the option to answer "where else is this posted", not to grow the dataset.
- **The region is a preference, not a filter.** Choosing a market nudges which videos rank highest; videos from elsewhere can still appear, and every row records which market was asked for.
- **The actor reports what the source publishes to the public.** It does not sign in, does not see anything behind a login, and cannot reveal a detail the source keeps private. Private, unlisted and age-restricted videos are outside what it can return.
- **A search the source refuses to complete is reported as a failed search**, never as "no results found". The run summary counts searches that produced videos, searches that genuinely matched nothing, and searches that could not be completed as three separate figures, so you always know which you are looking at.
- **Speed depends on the size of the job** and on the source's own response times. No fixed throughput is promised, and deep searches are slower per page than shallow ones.
- **The source's terms govern automated access.** You are responsible for using the data lawfully and in line with those terms, and for handling any personal data — channel names among them — in line with applicable privacy law, including GDPR and Russian personal data law where they apply.

### FAQ

**Do I need an account on the source site?**
No. Nothing is needed beyond starting the run.

**Does it need my login or password?**
No. It never signs in anywhere and never asks you for credentials of any kind.

**Can I schedule it?**
Yes. Schedule it like any other actor — daily, weekly or hourly — and each run writes its own table.

**Why is a view figure or a date missing on some rows?**
Because the source did not publish one for that video. Those columns are left empty on purpose. Filling them with a zero would look like a real measurement, and it would be wrong.

**What does "include the same video found on other platforms" actually give me?**
The source often finds one video posted in several places. With the option on, each of those copies becomes its own row and carries the same group identifier as the original, so you can see at a glance where a video has been re-posted and by whom. With it off, you get one row per video.

**Can I search in English?**
Yes, and it works. The index is strongest for Russian and other Cyrillic-language material, so Russian search terms will give you noticeably fuller results for the same topic.

**Does the actor return the video files themselves?**
No. It returns the address of each video on the platform that hosts it, together with the details listed above. It does not download or re-host anything.

# Actor input Schema

## `queries` (type: `array`):

What to search for. One row is produced for every video found. Terms in Russian give the fullest results, because this covers the Russian-speaking video market, but any language works.

## `maxResultsPerQuery` (type: `integer`):

How many videos to collect for each search term. The source publishes roughly 960 distinct videos for any one search, so anything above that returns what it makes available. Repeated videos are reported once.

## `duration` (type: `string`):

Restrict results by how long the videos are. Short is roughly up to ten minutes, medium is in between, and long is feature length. Leave it on "Any length" to search everything.

## `region` (type: `string`):

The market to lean the results towards. This nudges which videos rank highest; it is not a strict filter, so videos from elsewhere can still appear. Leave it empty to take the results as the source ranks them by default.

## `includeAlternateSources` (type: `boolean`):

The source often finds the same video posted on more than one platform. Turn this on to get each of those copies as its own row, which is how you see where a video has been re-posted. Turn it off to get one row per video. Copies are charged like any other row.

## `parallelSearches` (type: `integer`):

How many search terms to work through at the same time. Higher is faster on large jobs; leave it as it is unless a run is slower than you need.

## Actor input object example

```json
{
  "queries": [
    "обзор смартфона",
    "рецепт борща"
  ],
  "maxResultsPerQuery": 50,
  "duration": "any",
  "region": "",
  "includeAlternateSources": false,
  "parallelSearches": 3
}
```

# Actor output Schema

## `videos` (type: `string`):

Every video collected in this run.

## `overview` (type: `string`):

The same videos as a table, in the order the source ranked them.

## `spreadsheet` (type: `string`):

The videos as a spreadsheet file.

## `runSummary` (type: `string`):

How many searches produced videos, how many genuinely found nothing, and how many could not be completed.

# 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 = {
    "queries": [
        "обзор смартфона"
    ],
    "maxResultsPerQuery": 50,
    "duration": "any",
    "region": "",
    "parallelSearches": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("apt_marble/yandex-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 = {
    "queries": ["обзор смартфона"],
    "maxResultsPerQuery": 50,
    "duration": "any",
    "region": "",
    "parallelSearches": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("apt_marble/yandex-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 '{
  "queries": [
    "обзор смартфона"
  ],
  "maxResultsPerQuery": 50,
  "duration": "any",
  "region": "",
  "parallelSearches": 3
}' |
apify call apt_marble/yandex-video-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,apt_marble/yandex-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/KhNOkaYZXwmpadJqk/builds/6lTZvDf7gRahB2vmA/openapi.json
