# VK Posts Scraper (`maximedupre/vk-posts-scraper`) Actor

Scrape public VK posts from wall URLs, direct post URLs, profile/community URLs, handles, and owner IDs. Export text, authors, dates, engagement, media metadata, and source links.

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

## Pricing

from $4.45 / 1,000 vk posts

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 Posts Scraper for public wall posts

VK Posts Scraper collects public post data from [VK](https://vk.com/) wall targets and direct post URLs. Add a VK profile, community, handle, owner ID, wall URL, or post URL, then export clean rows with post text, author details, source links, publish dates, engagement counts, media metadata, and scrape timestamps.

Use this VK posts scraper when you need public VK wall data for social media monitoring, brand research, market analysis, community tracking, content archiving, or reporting. The Actor runs without asking for VK cookies, login details, or user credentials. It saves only successfully scraped public posts, so unavailable, private, hidden, or keyword-only targets are reported in logs instead of being saved as placeholder rows.

For a quick first run, keep the prefilled `durov` target and the default `25` post limit. After the run finishes, download the dataset as JSON, CSV, Excel, XML, RSS, or HTML, or connect it to your workflow with the Apify API, schedules, webhooks, and integrations.

### ✅ What this Actor does

- Scrapes public VK posts from profile walls, community walls, handles, owner IDs, wall URLs, and direct post URLs.
- Saves one public VK post per dataset row.
- Extracts post text, post IDs, owner IDs, source URLs, publish dates, scrape timestamps, author data, engagement metrics, and media metadata.
- Accepts date filters when you only want posts published in a specific window.
- Supports a total post limit and an optional per-target post limit to control run size and cost.
- Works without VK account credentials for public wall and post targets.
- Handles private, hidden, inaccessible, or unsupported targets as clean zero-row outcomes with user-facing log messages.

This Actor is focused on public VK wall posts. It does not scrape private posts, deleted posts, login-only content, VK Video downloads, followers, phone numbers, emails, or user lists. Public keyword post search is accepted as input for compatibility, but VK may not expose anonymous keyword post results during a run; in that case, the Actor logs the limitation and saves no keyword placeholder rows.

### 📦 Data you can export

Each VK post row can include:

- `target` and `targetType`
- `postId`, `ownerId`, and `sourceUrl`
- `text`
- `postedAt` and `scrapedAt`
- `author` with ID, name, type, VK profile URL, and avatar URL when visible
- `engagement` with likes, comments, reposts, views, and total engagement
- `media` with photo, video, or link metadata when VK exposes it
- `matchedKeywords`
- `rawPost` when you enable raw post output

Some fields can be empty when VK does not expose that value for a public post. The dataset contains usable scraped post rows only.

### 🚀 How to run the VK posts scraper

1. Add one or more VK targets in **VK targets**.
2. Use a direct post URL, wall URL, profile/community URL, handle, or owner ID.
3. Keep **Maximum posts** at `25` for a small test run.
4. Optional: set **Maximum posts per target** if you are scraping several walls.
5. Optional: add a published date range.
6. Start the Actor and open the dataset.

Accepted target examples:

```json
{
	"targets": [
		"durov",
		"https://vk.com/durov",
		"https://vk.com/wall1_2442097",
		"1",
		"club1"
	],
	"maxItems": 25,
	"maxItemsPerTarget": 10
}
````

### 🛠️ Input

| Field | What to enter |
| ----- | ------------- |
| `targets` | VK post URLs, wall URLs, profile or community URLs, handles such as `durov`, owner IDs such as `1`, or community IDs such as `club1`. |
| `maxItems` | Maximum number of VK posts to save across the whole run. Default is `25`. |
| `maxItemsPerTarget` | Optional maximum number of posts to save from each target. |
| `publishedAfter` | Save only posts published on or after this date when VK exposes a post date. |
| `publishedBefore` | Save only posts published on or before this date when VK exposes a post date. |
| `includeRawPost` | Add VK's raw post object to each row for advanced analysis. Keep it off for a cleaner dataset. |

### 📊 Output example

```json
{
	"target": "durov",
	"targetType": "handle",
	"postId": "1_2442097",
	"ownerId": 1,
	"sourceUrl": "https://vk.com/wall1_2442097",
	"text": "Post text from VK...",
	"postedAt": "2018-05-08T18:59:24.000Z",
	"scrapedAt": "2026-05-29T17:27:27.582Z",
	"author": {
		"id": 1,
		"name": "Pavel Durov",
		"type": "profile",
		"profileUrl": "https://vk.com/durov",
		"avatarUrl": "https://sun9-20.userapi.com/..."
	},
	"engagement": {
		"likes": 241901,
		"comments": 0,
		"reposts": 14750,
		"views": 15550526,
		"total": 15807177
	},
	"media": [],
	"matchedKeywords": []
}
```

### 💳 Pricing

VK Posts Scraper uses pay-per-event pricing. You are charged only for each successfully scraped VK post saved to the dataset.

There is no separate Actor-start charge. Private, hidden, unsupported, or zero-result targets are reported in logs and are not charged as scraped posts.

### ⚠️ Limits and caveats

- The Actor collects public VK wall and post data only.
- Keyword-only targets may return no rows because VK does not always expose public keyword post search without login.
- Private profiles, hidden walls, deleted posts, and login-only content are skipped.
- Engagement counts and media fields depend on what VK exposes for each public post.
- Date filters only apply when a post publish timestamp is available.
- The Actor does not download VK videos or media files; it returns media metadata and source URLs when available.

### ❓ FAQ

#### 🔐 Does this VK posts scraper need VK cookies or login details?

No. It is built for public VK post and wall data and does not ask for user credentials.

#### 🔗 Can I scrape a direct VK post URL?

Yes. Paste a URL such as `https://vk.com/wall1_2442097` in `targets`, and the Actor will save the public post if VK exposes it.

#### 🧱 Can I scrape a VK community wall?

Yes. Use a community URL, handle, owner ID, or `club...` style target. Hidden or restricted walls are skipped with a log message.

#### 🔎 Can I use this as a VK keyword scraper?

Keyword inputs are accepted, but public keyword post search may return no rows because VK does not consistently expose anonymous keyword post results. Use wall, handle, owner ID, or direct post targets when you need reliable public post extraction.

### 📝 Changelog

- 0.0: Initial release.

### 🆘 Support

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

### 🔗 Other actors

- [Telegram Channel Messages Scraper ↗](https://apify.com/maximedupre/telegram-channel-messages-scraper) - Export public Telegram channel posts with text, views, reactions, links, and media metadata.
- [Twitter Scraper ↗](https://apify.com/maximedupre/twitter-scraper) - Search public Twitter/X posts and trending topics for social listening and reporting.
- [LinkedIn Posts Scraper ↗](https://apify.com/maximedupre/linkedin-posts-scraper) - Collect public LinkedIn profile, company, and direct post data.
- [Reddit Scraper ↗](https://apify.com/maximedupre/reddit-scraper) - Find Reddit posts and comments around a topic, brand, or trend.
- [TikTok Profile Mention Scraper ↗](https://apify.com/maximedupre/tiktok-profile-mention-scraper) - Find public TikTok videos that mention selected profile handles.

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

# Actor input Schema

## `targets` (type: `array`):

Enter one or more public VK targets: handles like <code>durov</code>, profile or community URLs, direct post URLs, wall URLs, owner IDs such as <code>1</code>, or community IDs such as <code>club1</code>. Public wall and post targets work without VK cookies or login details.

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

Maximum number of VK post rows to save across the whole run. Keep the default for a small first test, then raise it once the output matches your workflow.

## `maxItemsPerTarget` (type: `integer`):

Optional cap for each VK wall, handle, owner ID, or post target. Leave empty to let the total maximum control the run.

## `publishedAfter` (type: `string`):

Save only VK posts published on or after this date when VK exposes the post timestamp.

## `publishedBefore` (type: `string`):

Save only VK posts published on or before this date when VK exposes the post timestamp.

## `includeRawPost` (type: `boolean`):

Add VK's raw post object to each saved row for advanced analysis. Keep this off for a cleaner export.

## Actor input object example

```json
{
  "targets": [
    "durov"
  ],
  "maxItems": 25,
  "includeRawPost": false
}
```

# Actor output Schema

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

Open the dataset with one row per public VK post.

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

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/vk-posts-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 = { "targets": ["durov"] }

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/vk-posts-scraper").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 '{
  "targets": [
    "durov"
  ]
}' |
apify call maximedupre/vk-posts-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "VK Posts Scraper",
        "description": "Scrape public VK posts from wall URLs, direct post URLs, profile/community URLs, handles, and owner IDs. Export text, authors, dates, engagement, media metadata, and source links.",
        "version": "0.0",
        "x-build-id": "ct5YcTMF03mGVRGO7"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/maximedupre~vk-posts-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-maximedupre-vk-posts-scraper",
                "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-posts-scraper/runs": {
            "post": {
                "operationId": "runs-sync-maximedupre-vk-posts-scraper",
                "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-posts-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-maximedupre-vk-posts-scraper",
                "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": [
                    "targets"
                ],
                "properties": {
                    "targets": {
                        "title": "VK targets",
                        "type": "array",
                        "description": "Enter one or more public VK targets: handles like <code>durov</code>, profile or community URLs, direct post URLs, wall URLs, owner IDs such as <code>1</code>, or community IDs such as <code>club1</code>. Public wall and post targets work without VK cookies or login details.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Maximum posts",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum number of VK post rows to save across the whole run. Keep the default for a small first test, then raise it once the output matches your workflow.",
                        "default": 25
                    },
                    "maxItemsPerTarget": {
                        "title": "Posts per target",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Optional cap for each VK wall, handle, owner ID, or post target. Leave empty to let the total maximum control the run."
                    },
                    "publishedAfter": {
                        "title": "Published after",
                        "type": "string",
                        "description": "Save only VK posts published on or after this date when VK exposes the post timestamp."
                    },
                    "publishedBefore": {
                        "title": "Published before",
                        "type": "string",
                        "description": "Save only VK posts published on or before this date when VK exposes the post timestamp."
                    },
                    "includeRawPost": {
                        "title": "Include raw post",
                        "type": "boolean",
                        "description": "Add VK's raw post object to each saved row for advanced analysis. Keep this off for a cleaner export.",
                        "default": false
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
