# VK Profile Posts Scraper – Public Wall Export (`scrapingmonkey/vk-profile-posts-scraper`) Actor

Collect public VK profile posts by screen name. Export text, authors, dates, engagement counts, media references, and profile details with wall pagination.

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

## Pricing

from $1.00 / 1,000 results

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?

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

Collect public posts from known VK user walls, with the source profile's details attached to each result. **VK Profile Posts Scraper** returns post text, authors, dates, engagement counts, media references, and available repost context.

Use it to research a creator's public content, compare posts across a known account list, or build a dataset for repeated analysis. A page budget controls how far to collect from each profile, while every post remains a separate row.

| At a glance | Details |
|---|---|
| 📥 Input | Plain VK profile screen names, such as `durov` |
| 📤 Output | One row per collected post, with source-profile context |
| 📄 Pagination | Configurable pages per profile; wall offsets advance by 10 |
| 📎 Media | Available attachment metadata, URLs, previews, and supplied repost details |
| 🔐 Login required | No VK credentials or cookies |

### What the VK profile posts scraper collects 📰

Each collected wall post can include:

- Composite post ID, numeric ID, wall owner ID, and permalink
- Text, author name and ID, profile link, and avatar
- Publication timestamp, UTC date, and visible date text
- Like, comment, repost, and view counts
- Photo, video, document, link, poll, or other attachment metadata when exposed
- Supplied repost history and available copyright or geographic context
- Pinned, advertising, favorite, and action indicators
- Public source-profile details

The source profile's identity, biography, follower count, links, and other available details repeat on each post. This keeps the account context available when individual posts are filtered or exported.

### How to scrape VK profile posts 🚀

1. Add plain profile screen names such as `durov`.
2. Choose `pagesPerProfile` for the wall-page budget.
3. Start the Actor and review the collected posts and any failed rows.
4. Export the dataset or pass selected post URLs to another workflow.

```json
{
  "inputList": [
    "durov"
  ],
  "pagesPerProfile": 2
}
```

Duplicate screen names are processed once case-insensitively. Repeated post IDs are removed across pages of the same wall.

### VK profile post fields and output 📦

| Field group | Included data |
|---|---|
| Post identity | Input, status, composite ID, numeric post ID, wall owner, and URL |
| Content and author | Text, author identity, avatar, dates, and timestamp |
| Engagement | Likes, comments, reposts, and views |
| Media and context | Attachments, supplied repost history, copyright, geography, and post indicators |
| Source profile | Profile ID, name, biography, website, audience counts, images, and available background or connected-account fields |

Complete illustrative output item with all 125 fields. The post, profile, and values below are fictional examples, not a live result:

```json
{
  "input": "sample.creator",
  "status": "success",
  "url": "https://vk.ru/wall123456789_125",
  "id": "123456789_125",
  "post_id": 125,
  "owner_id": 123456789,
  "author_id": 123456789,
  "text": "A few notes from today's architecture photography walk.",
  "date": "2026-09-08T11:00:00Z",
  "timestamp": 1788865200,
  "date_text": "8 сен 2026 в 14:00",
  "author.id": 123456789,
  "author.name": "Alex Morgan",
  "author.url": "https://vk.ru/sample.creator",
  "author.avatar_url": "https://example.com/avatar-400.jpg",
  "likes_count": 84,
  "comments_count": 12,
  "reposts_count": 7,
  "views_count": 2400,
  "attachments.path": [
    "/0/type",
    "/0/id",
    "/0/owner_id",
    "/0/album_id",
    "/0/text",
    "/0/timestamp",
    "/0/url",
    "/0/width",
    "/0/height",
    "/0/thumbnails/0/url",
    "/0/thumbnails/0/width",
    "/0/thumbnails/0/height",
    "/0/thumbnails/0/type"
  ],
  "attachments.value": [
    "photo",
    987654321,
    123456789,
    -7,
    "Workshop studio",
    1788865200,
    "https://example.com/workshop-photo.jpg",
    1280,
    853,
    "https://example.com/workshop-photo.jpg",
    1280,
    853,
    "x"
  ],
  "reposted_posts.path": [],
  "reposted_posts.value": [],
  "post_type": "post",
  "signer_id": 0,
  "is_pinned": false,
  "is_ad": false,
  "is_favorite": false,
  "can_like": false,
  "can_comment": false,
  "can_repost": false,
  "copyright.path": [],
  "copyright.value": [],
  "geo.path": [],
  "geo.value": [],
  "profile.avatar_url": "https://example.com/avatar-400.jpg",
  "profile.profile_url": "https://vk.ru/sample.creator",
  "profile.id": 123456789,
  "profile.username": "sample.creator",
  "profile.name": "Alex Morgan",
  "profile.first_name": "Alex",
  "profile.last_name": "Morgan",
  "profile.profile_status": "Sharing photography notes",
  "profile.about": "Photographer and workshop organizer.",
  "profile.birth_date": "",
  "profile.city.id": 1,
  "profile.city.name": "Moscow",
  "profile.country.id": 1,
  "profile.country.name": "Russia",
  "profile.website": "https://example.com/portfolio",
  "profile.followers_count": 4200,
  "profile.friends_count": 280,
  "profile.subscriptions_count": 46,
  "profile.posts_count": 125,
  "profile.photos_count": 340,
  "profile.videos_count": 18,
  "profile.clips_count": 7,
  "profile.is_verified": false,
  "profile.is_private": false,
  "profile.can_access_closed": true,
  "profile.occupation.id": 0,
  "profile.occupation.name": "Independent photographer",
  "profile.occupation.type": "work",
  "profile.career.path": [
    "/0/company",
    "/0/position",
    "/0/from"
  ],
  "profile.career.value": [
    "Example Studio",
    "Photographer",
    2021
  ],
  "profile.schools.path": [],
  "profile.schools.value": [],
  "profile.universities.path": [
    "/0/name",
    "/0/graduation"
  ],
  "profile.universities.value": [
    "Example Institute of Design",
    2020
  ],
  "profile.contacts.mobile_phone": "",
  "profile.contacts.home_phone": "",
  "profile.nickname": "",
  "profile.maiden_name": "",
  "profile.sex": 0,
  "profile.sex_name": "",
  "profile.home_town": "",
  "profile.activities": "Photography workshops",
  "profile.interests": "Architecture, photography",
  "profile.music": "",
  "profile.movies": "",
  "profile.tv": "",
  "profile.books": "",
  "profile.games": "",
  "profile.quotes": "",
  "profile.avatar_thumbnails.size": [
    "100",
    "400_orig"
  ],
  "profile.avatar_thumbnails.url": [
    "https://example.com/avatar-100.jpg",
    "https://example.com/avatar-400.jpg"
  ],
  "profile.cover_url": "https://example.com/cover.jpg",
  "profile.cover_images.url": [
    "https://example.com/cover.jpg"
  ],
  "profile.cover_images.width": [
    1590
  ],
  "profile.cover_images.height": [
    400
  ],
  "profile.audios_count": 0,
  "profile.albums_count": 8,
  "profile.gifts_count": 0,
  "profile.articles_count": 4,
  "profile.mutual_friends_count": 0,
  "profile.online": false,
  "profile.online_mobile": false,
  "profile.last_seen_at": 1788868800,
  "profile.last_seen_date": "2026-09-08T12:00:00Z",
  "profile.last_seen_platform": 7,
  "profile.is_trending": false,
  "profile.is_deactivated": false,
  "profile.deactivated_reason": "",
  "profile.is_memorial": false,
  "profile.is_service": false,
  "profile.is_nft": false,
  "profile.is_no_index": false,
  "profile.friend_status": 0,
  "profile.can_message": false,
  "profile.can_send_friend_request": false,
  "profile.can_post": false,
  "profile.can_see_all_posts": true,
  "profile.can_see_audio": false,
  "profile.military.path": [],
  "profile.military.value": [],
  "profile.relatives.path": [],
  "profile.relatives.value": [],
  "profile.personal.path": [],
  "profile.personal.value": [],
  "profile.connections.skype": "",
  "profile.connections.facebook": "",
  "profile.connections.facebook_name": "",
  "profile.connections.twitter": "",
  "profile.connections.instagram": "sample.creator",
  "profile.connections.livejournal": ""
}
```

Each post occupies one row in one table. JSON uses the same literal keys as the columns, including `author.name` and `profile.name`. The source profile is repeated within each post row rather than saved as a separate result.

Variable attachment fields use matching `attachments.path` and `attachments.value` lists. For example, `/0/type` identifies the first attachment's type; the corresponding value is at the same list position. Reposted content, copyright, and geography use the same paired-list pattern. Variable profile sections, such as `profile.career.path` and `profile.career.value`, use the same pattern. Profile avatar and cover-image fields use aligned lists within each image group.

Successful results preserve empty strings, empty lists, `0`, and `false` when values are omitted. Missing counts should not automatically be interpreted as confirmed zero engagement or audience. Failed results retain `input`, set `status` to `failed`, and use `null` for the other fields.

### Input requirements and wall coverage ⚙️

| Parameter | Type | Default | Rules |
|---|---|---|---|
| `inputList` | array of strings | Required | At least one VK profile screen name |
| `pagesPerProfile` | integer | `1` | Minimum 1; no fixed upper limit |

Screen names must contain 1–64 letters, digits, underscores, or periods. Surrounding whitespace is trimmed. Accepted: `durov`. Rejected: `@durov`, `https://vk.ru/durov`, or a name containing spaces.

The name must resolve to a user profile rather than a community. Private or restricted profiles may return limited public data or fail. Use Community Posts Scraper for groups and public pages.

Wall pages use offsets that advance by 10. Collection continues while a page contains posts, within the requested page budget and any reported wall total. An empty page ends that wall's pagination. A page containing only previously seen posts adds no duplicates but can still lead to another request.

An empty wall before any posts have been collected produces a failed row. An empty page after successful collection adds no failure. Page budgets do not guarantee exactly 10 saved posts per page or a complete historical archive.

### VK profile post use cases 🎯

#### Creator-content research

Collect public wall posts from a known account list and retain each author's profile context for review.

#### Post-format comparisons

Compare text, attachments, dates, and public engagement across selected profiles without losing the source account.

#### Repeated content collection

Schedule runs and compare composite post IDs in your database to identify newly observed posts or changed public counts.

#### Discussion follow-up

Select relevant wall-post URLs and use Post Comments Scraper to collect the public discussion around them.

### Pricing and billable post rows 💰

Check the Actor's **Pricing** tab for the current charging model and rate.

Under dataset-item pricing, each saved post or failed row can count as a result. An unavailable profile, an empty wall, or a page that remains unavailable after retries can produce a failed row. Automatic retries do not independently create additional rows.

Source-profile details, attachments, and repost history remain in each post row. Increasing `pagesPerProfile` can increase the number collected, but it sets a page budget rather than an exact result count.

### VK profile posts API and integrations 🔌

Use the ID shown in the Actor's API tab for `$ACTOR_ID` and your Apify token for `$APIFY_TOKEN`:

```bash
curl -X POST "https://api.apify.com/v2/acts/$ACTOR_ID/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"inputList":["durov"],"pagesPerProfile":2}'
```

Call the Actor through REST, Apify client libraries, schedules, or webhooks. Send its default dataset to a spreadsheet, Make, Zapier, a content database, or your own reporting workflow. Composite post IDs are useful for comparing repeated runs.

### Reliability and public wall limits ⚠️

The Actor processes up to five requests concurrently and retries temporary request failures. An invalid screen name, wrong target type, or unavailable page produces a failed row while other profiles continue.

A later-page failure leaves previously saved posts in the dataset and adds a failed row for the same input. Duplicate suppression applies within a wall's pagination; repeated runs need their own ID-based comparison.

VK may restrict wall history, omit counts or attachments, and change public page layouts. Supplied repost history is included to a maximum of three levels; original source posts are not separately crawled. Media URLs may expire, and the Actor does not download binary files.

### Frequently asked questions ❓

#### Can I submit full VK links?

Enter plain profile screen names. For `https://vk.ru/durov`, submit `durov`.

#### Will two pages always produce 20 posts?

No. Wall offsets advance by 10, but short responses, duplicates, restrictions, and the end of available content can reduce the number saved.

#### Are profile details a separate result?

No. The source profile's public details are included on every post row, so the exported post keeps its account context.

#### Does it collect all historical wall posts?

It collects the pages available within your budget. Public restrictions, source totals, and empty pages can end collection before a complete history is available.

#### Does it return comments or download media?

It returns the available comment count and media references. Use Post Comments Scraper for individual comments; binary media files are not downloaded.

#### What happens when a wall is empty?

If no posts have been collected, an empty wall produces a failed row. An empty page after successful collection simply ends pagination.

### Support, responsible use, and related actors 🛟

For a reproducible issue, share the run ID, a public profile screen name, the page budget, and the expected behavior through the Actor's support channel.

Use public wall content in accordance with applicable privacy, copyright, contractual, and platform requirements.

# Actor input Schema

## `inputList` (type: `array`):

Enter one VK profile screen name per item, for example durov. Use only the screen name without @ or a VK link.

## `pagesPerProfile` (type: `integer`):

Choose how many wall pages to request for each profile. Collection stops automatically when VK returns no more posts.

## Actor input object example

```json
{
  "inputList": [
    "durov"
  ],
  "pagesPerProfile": 1
}
```

# Actor output Schema

## `posts` (type: `string`):

One success Dataset row per unique VK profile post, plus failed rows for inputs or pages that could not be processed.

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

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

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

```

## MCP server setup

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