# VK Posts Scraper: VKontakte Wall Posts, Likes & Views (`xmolodtsov/vk-posts-scraper`) Actor

Scrape public VKontakte wall posts with text, dates, likes, comments, reposts, views and attachment metadata. Filter by date and export JSON, CSV or Excel. No login or VK token.

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

## Pricing

from $2.00 / 1,000 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/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

<img src="https://api.apify.com/v2/key-value-stores/2DxCOvbMjhvK3S1qP/records/vk-posts-avatar-1024.png" alt="VK Posts Scraper" width="96" />

Export public VKontakte wall posts with text, dates, likes, comments, repost and view counts, and attachment metadata. Supply community handles, profile URLs or wall IDs; get one structured row per post. No VK account or token is needed.

![VK wall post output preview](https://api.apify.com/v2/key-value-stores/2DxCOvbMjhvK3S1qP/records/vk-posts-output-preview.png)

### Quick start

1. Enter public pages, for example `ria`, `rt_russian` or `sportsru`.
2. Choose how many posts to save per page and for the run. Optionally set a UTC start date or exclude reposts.
3. Run the Actor and export the dataset as JSON, CSV or Excel.

The prefill fetches 20 posts from the public RIA community. For a larger collection:

```json
{
  "pages": ["ria", "https://vk.com/rt_russian", "sportsru"],
  "maxPostsPerPage": 100,
  "maxItems": 300,
  "includeReposts": true
}
```

Call it from the Apify API using your Apify API token:

```bash
curl -X POST 'https://api.apify.com/v2/acts/xmolodtsov~vk-posts-scraper/run-sync-get-dataset-items' \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"pages":["ria"],"maxPostsPerPage":20}'
```

### Input

| Field | Default | Meaning |
|---|---|---|
| `pages` | Required | 1–100 handles, VK community/profile URLs, `club123`, `public123`, `id123`, numeric/signed owner IDs, or wall/post URLs. Supports vk.com, vk.ru and m.vk.com. URLs may include queries or trailing slashes. Repeated resolved owners are collected once. |
| `maxPostsPerPage` | `100` | Maximum saved posts per owner; `0` collects the accessible wall until its end or another limit. |
| `dateFrom` | Unset | `YYYY-MM-DD` or `N days`, evaluated in UTC. Older pinned posts are skipped without stopping the wall. The first older ordinary post stops it. Undated posts are skipped when this filter is set. |
| `includeReposts` | `true` | Set false to exclude copied posts before applying result caps. |
| `maxItems` | `1000` | Run-wide result cap, up to 100,000. On Apify's free plan, the developer limits each run to 100 results and each user to 20 runs per UTC calendar month. |
| `proxyConfiguration` | Apify datacenter | Apify RESIDENTIAL is replaced by datacenter. Paid runs may use their own proxy URLs for another route. Free runs use Apify Proxy only. |

Invalid entries are skipped with a warning if others are usable. If every entry is invalid, the run fails with `invalid:`. Unknown, deleted, private and closed pages require a positive unavailable marker and are counted separately; other pages continue.

### Output

Each saved post has an exact string `postId` (`<signed ownerId>_<id>`), its URL and page context, text and UTC date, optional edit time, pinned/repost flags, public author context, available counts, attachment metadata, original input and collection time. Missing values are `null`; missing attachment collections are empty arrays.

The following example comes from a real datacenter proof run. Text and attachments are shortened for readability; private-person names are replaced with placeholders where applicable.

```json
{
  "postId": "-755816_3926556",
  "ownerId": "-755816",
  "id": "3926556",
  "url": "https://vk.com/wall-755816_3926556",
  "pageName": "Спортс\"",
  "pageScreenName": "sportsru",
  "pageUrl": "https://vk.com/sportsru",
  "text": "😰🇬🇧 Один из ведущих журналистов по «МЮ», Джеймс Дакер из The Telegraph, сообщает, что будущее Майкла Кэррика на посту главного тренера клуба под серьезной угрозой",
  "date": "2026-10-21T21:55:51.000Z",
  "editedAt": null,
  "isPinned": false,
  "isRepost": false,
  "repost": null,
  "authorId": null,
  "authorName": null,
  "likesCount": 6,
  "commentsCount": 1,
  "repostsCount": 1,
  "viewsCount": 1353,
  "attachments": [
    {
      "type": "photo",
      "url": "https://sun9-83.vkuserphoto.ru/s/v1/ig2/-YQqeaY-UvGGNzkrZHUqc0NBgd0ciXEw3hB_aX7HjItCUKFNH1PTSnnxvqdYSSYzPwbpa_JlZ6cHXAatFtUkfJX1.jpg?quality=96&as=32x32,48x48,72x72,108x108,160x160,240x240,360x360,480x480,540x540,640x640,720x720,1080x1080,1280x1280&from=bu&u=2xgH48zWNJ3ZpV31JWzpvVhuGaKjo4QM66nuVS8e0ow&cs=1280x0",
      "width": 1280,
      "height": 1280,
      "title": null,
      "duration": null
    }
  ],
  "inputUrl": "sportsru",
  "scrapedAt": "2026-10-21T23:26:00.278Z"
}
```

`repost`, when available, contains the copied post's `postId`, `url`, `ownerId`, `ownerName`, `text` and `date`. Counts (`likesCount`, `commentsCount`, `repostsCount`, `viewsCount`) remain nullable because VK may hide them. Attachments contain `type`, `url`, `width`, `height`, `title` and `duration` for photos, videos, links, documents, audio and polls. Media is not downloaded. Embedded reply nodes never become post rows.

### Pricing

Billing uses one `Post` event per saved dataset row, with no start fee or add-on events.

| Apify plan | Price per 1,000 posts |
|---|---:|
| FREE | $3.60 |
| BRONZE | $3.20 |
| SILVER | $2.60 |
| GOLD, PLATINUM, DIAMOND | $2.00 |

| Example | BRONZE total | GOLD total |
|---|---:|---:|
| 100 saved posts | $0.32 | $0.20 |
| 300 saved posts | $0.96 | $0.60 |
| 2,000 saved posts | $6.40 | $4.00 |

Totals are the listed Post event charges. Free-plan use draws on available Apify credit at the FREE rate; actual availability depends on your Apify account.

#### Is it free?

Apify's free plan can use available monthly credit. This developer permits **100 results per run and 20 runs per UTC calendar month**, shared across your runs of this Actor. The 21st run succeeds with a quota message before starting any proxy requests. The quota resets on the first day of the next UTC month. Paid Apify plans remove these developer caps; input and budget limits still apply.

### Reliability and limits

Residential Apify Proxy is not used: it measured unreliable for VK; datacenter measured 0 refusals in the build proof. An Apify `RESIDENTIAL` group is removed (other selected groups are kept), with one warning and `STATISTICS.proxyOverride = "RESIDENTIAL->DATACENTER"`. Paid runs may use their own proxy URLs for another route. Free runs use Apify Proxy only. No public wall is guaranteed to remain available or complete.

Wall offsets advance by ten. A valid `no_posts` answer, or a measured final short page at the reported total, confirms a clean end. Repeated pages or later source/shape errors count as truncation and are logged separately. Caps, date filters and budget/deadline stops can intentionally end a collection before the wall's end. Pinned posts can be older than posts after them and never stop date-based paging.

Saved rows survive later input failures. Such runs succeed with a partial status. Confirmed empty or unavailable walls can succeed with no results. Processing failures with zero saved rows fail with a diagnostic prefix such as `blocked:`, `network:`, `timeout:` or `outdated:`. Budget exhaustion succeeds with `run budget reached`. Near a run timeout the Actor stops starting requests, flushes rows and writes `STATISTICS`. Dataset IDs seed deduplication after restarts, so already saved posts are not pushed again. A restart can still see newly published or removed source posts.

#### What's not included

Comments or reply harvesting, reaction breakdowns, contact data, member lists, private walls, downloads, monitoring, VK-wide search and authenticated access are outside this Actor's scope. A comment count does not include comment content. Attachments and repost details depend on what the anonymous source exposes.

### Integrations

Use Apify datasets with the API, webhooks, n8n or Make. Export JSON for nested attachments and repost context, or CSV/Excel for spreadsheets. Configure schedules in Apify if your workflow needs repeat runs; each run is a new collection.

### FAQ

#### Why did I receive fewer posts than requested?

The wall may end, the date/repost filters may exclude posts, or a free-plan, input, budget or deadline limit may apply. Check the status message and `STATISTICS` for clean ends, truncations, unavailable pages, failed inputs and refusal counts. Anonymous access can expose fewer posts than a logged-in browser.

#### Is it legal to scrape VK posts?

This Actor accesses public walls without logging in and does not collect contact fields. Public availability does not remove privacy, copyright or platform obligations. Use the output only where you have an appropriate lawful basis and handle any personal data under applicable rules, including GDPR or CCPA where relevant. Do not use it to access private data.

#### How do I get help?

Open an issue in the Actor's Apify Issues tab with a public input, run URL and expected result. Avoid including credentials or private data.

### More scrapers from this developer

**TikTok:** [TikTok Search Scraper](https://apify.com/xmolodtsov/tiktok-search-scraper): Videos and creators for any keyword, pay per result ·
[TikTok Profile Scraper (Pay Per Result)](https://apify.com/xmolodtsov/tiktok-profile-scraper): Profiles, followers and latest posts by username ·
[TikTok Comments Scraper](https://apify.com/xmolodtsov/tiktok-comments-scraper): Comments and full reply threads from any video ·
[TikTok Hashtag Scraper](https://apify.com/xmolodtsov/tiktok-hashtag-scraper): Videos for any hashtag, with views, likes and music ·
[TikTok Sound & Music Scraper](https://apify.com/xmolodtsov/tiktok-sound-scraper): Videos that use a sound or song ·
[TikTok Top Ads Scraper](https://apify.com/xmolodtsov/tiktok-top-ads-scraper): Public Creative Center ad rankings, engagement, media and landing pages

**Social & news:** [Reddit Search Scraper](https://apify.com/xmolodtsov/reddit-scraper): Posts by keyword, subreddit or author ·
[Google News Scraper](https://apify.com/xmolodtsov/google-news-scraper): Google News results as clean full-text articles ·
[Threads Replies Scraper](https://apify.com/xmolodtsov/threads-replies-scraper): Public post replies, likes, authors and inline nested replies

**Instagram:** [Instagram Reel Scraper](https://apify.com/xmolodtsov/instagram-reel-scraper): Public profile reels, plays, captions, music and media URLs ·
[Instagram Comment Scraper](https://apify.com/xmolodtsov/instagram-comment-scraper): Public post and reel comments, likes, timestamps and usernames

**E-commerce:** [Prom.ua Product Search Scraper](https://apify.com/xmolodtsov/prom-ua): Prom.ua product search results, no browser needed ·
[Amazon Product Search & Bestsellers Scraper](https://apify.com/xmolodtsov/amazon-search-scraper): Search results, Best Sellers and product details from Amazon ·
[AliExpress Search Scraper](https://apify.com/xmolodtsov/aliexpress-search-scraper): AliExpress products by keyword with prices, orders and shipping ·
[AliExpress Product Reviews Scraper](https://apify.com/xmolodtsov/aliexpress-reviews-scraper): Public product reviews, ratings, buyer photos and follow-up feedback

**Maps & leads:** [Google Maps Scraper](https://apify.com/xmolodtsov/google-maps-scraper): Places, leads and emails from Google Maps

**Ads:** [Facebook Ad Library Scraper (Meta Ads Library)](https://apify.com/xmolodtsov/facebook-ads-library-scraper): Ads from the Meta Ad Library, with EU reach and payers ·
[Google Ads Transparency Scraper](https://apify.com/xmolodtsov/google-ads-transparency-scraper): Google ad creatives by advertiser or domain, with regional details

**Video:** [YouTube Transcript Scraper](https://apify.com/xmolodtsov/youtube-transcript-scraper): Transcripts, subtitles and captions from YouTube videos ·
[YouTube Shorts Scraper](https://apify.com/xmolodtsov/youtube-shorts-scraper): Shorts of any channel with exact views, likes and duration ·
[YouTube Channel Scraper](https://apify.com/xmolodtsov/youtube-channel-scraper): Every video of a channel, with channel stats ·
[YouTube Search Scraper](https://apify.com/xmolodtsov/youtube-search-scraper): Search results and videos for any keyword ·
[YouTube Comments Scraper](https://apify.com/xmolodtsov/youtube-comments-scraper): Comments, replies and likes from any video ·
[Bilibili Comments Scraper](https://apify.com/xmolodtsov/bilibili-comments-scraper): Public hot comments and reply threads by video or keyword

**Jobs:** [SEEK Job Listings Scraper](https://apify.com/xmolodtsov/seek-jobs-scraper): Public AU/NZ job listings, salaries and redacted descriptions

# Changelog

This Actor's version history is a separate document: https://apify.com/xmolodtsov/vk-posts-scraper/changelog.md

# Actor input Schema

## `pages` (type: `array`):

1–100 public wall handles, community/profile URLs on vk.com/vk.ru/m.vk.com, club/public/id forms, signed owner IDs, or wall URLs. Invalid entries are skipped when others are valid; resolved owners are deduplicated.

## `maxPostsPerPage` (type: `integer`):

Maximum saved posts from each resolved owner after filtering. Use 0 for the entire publicly accessible wall, bounded by maxItems and the run timeout.

## `dateFrom` (type: `string`):

Optional UTC date YYYY-MM-DD or N days (for example 7 days). Older posts are skipped; the first older non-pinned post stops paging. Old pinned posts never stop paging.

## `includeReposts` (type: `boolean`):

Include posts containing a copied post. Set false to skip copy-history posts.

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

Run-wide saved-row limit, 1–100000. The Apify free plan is limited by this developer to 100 results per run and 20 runs per UTC calendar month. Paid plans use your requested limit.

## `proxyConfiguration` (type: `object`):

Residential Apify Proxy is not used: it measured unreliable for VK; datacenter measured 0 refusals in the build proof. RESIDENTIAL is removed from Apify groups (other groups are kept), with one warning and STATISTICS.proxyOverride = RESIDENTIAL->DATACENTER. Paid runs may use their own proxy URLs for another route. Free-plan cloud runs always use Apify Proxy and ignore custom proxies/direct mode.

## Actor input object example

```json
{
  "pages": [
    "ria"
  ],
  "maxPostsPerPage": 20,
  "includeReposts": true,
  "maxItems": 1000,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One row per unique postId: exact string identifiers, page metadata, text and dates, pin/repost state, copied-post context, public signer, nullable engagement counts, attachment metadata, inputUrl and scrapedAt.

# 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 = {
    "pages": [
        "ria"
    ],
    "maxPostsPerPage": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("xmolodtsov/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 = {
    "pages": ["ria"],
    "maxPostsPerPage": 20,
}

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

```

## MCP server setup

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