VK Posts Scraper avatar

VK Posts Scraper

Pricing

from $1.20 / actor start

Go to Apify Store
VK Posts Scraper

VK Posts Scraper

Extract wall posts from public VK (VKontakte) profiles and communities: post text, exact UTC timestamps, attachment URLs with VK object IDs, media types and repost flags. Add a VK access token to also get engagement counts, authors and comment threads. Export to JSON, CSV or Excel.

Pricing

from $1.20 / actor start

Rating

0.0

(0)

Developer

Divya Raj

Divya Raj

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

12 days ago

Last modified

Share

What does VK Posts Scraper do?

VK Posts Scraper extracts wall posts from public VK (VKontakte) profiles and communities — post text, publication timestamps, attachment URLs with their VK object IDs, repost chains, and engagement counts. Give it a handle like durov, a community URL, an owner ID, or a direct post link, and it walks the wall and returns structured JSON.

It runs on the Apify platform, so you get scheduling, a REST API, webhook and integration support, automatic proxy rotation, and run monitoring without maintaining any infrastructure yourself.

The scraper has two modes. Without a VK access token it scrapes VK's public HTML, which returns text, dates, and media links. With a token it uses the official VK API and returns everything — engagement counts, author profiles, comment threads, polls, and geotags. See Extraction modes for exactly which fields each mode fills.

Why use VK Posts Scraper?

  • Competitor and brand monitoring — track what communities in your market publish, and how often.
  • Content research — pull a community's back catalogue to analyse topics, formats, and posting cadence.
  • Media and archival work — capture posts with their attachment URLs before they change or disappear.
  • Dataset building — collect Russian-language social text for analysis, with exact timestamps.
  • Feeding other tools — schedule runs and push results to Google Sheets, S3, a webhook, or your own API.

How to use VK Posts Scraper

  1. Click Try for free (or Start if you already have it).
  2. In the Input tab, add one or more targets to VK targets — for example kinopoisk, https://vk.com/durov, or -220754053.
  3. (Recommended) Paste a VK access token. This unlocks engagement counts, authors, and comments. See Getting an access token.
  4. Set Maximum posts to control how much you collect.
  5. Click Start and wait — most runs finish in under a minute.
  6. Open the Output tab, or download the dataset as JSON, CSV, Excel, or HTML.

Input

Configure everything from the Input tab. Only vkTargets is required.

FieldTypeDefaultDescription
vkTargetsarrayrequiredHandles (durov), profile/community URLs, signed owner IDs (-220754053), or post links (https://vk.com/wall1_45678).
accessTokenstring (secret)VK API token with the wall scope. Strongly recommended.
maxItemsinteger50Total posts across all targets. Raise it for a full crawl, and raise the run timeout with it.
postsPerTargetintegerOptional per-target cap.
publishedAfterstringYYYY-MM-DD or ISO-8601. Pagination stops at older posts.
publishedBeforestringYYYY-MM-DD or ISO-8601. A bare date includes the whole day.
postFilterenumallall, owner, or others. API mode only.
includeCommentsbooleanfalseFetch comment threads with replies. API mode only.
maxCommentsinteger100Comments per post when the above is on.
keepUndatedPostsbooleanfalseKeep posts whose date could not be read, even when a date filter is set.
htmlTimezonestringEurope/MoscowTimezone VK renders times in. HTML mode only.
includeRawPostbooleanfalseAttach the unmodified VK API object as rawPost.
proxyConfigurationobjectResidentialVK blocks most datacenter IPs.
{
"vkTargets": ["https://vk.com/vkvideo", "kinopoisk"],
"accessToken": "vk1.a.…",
"maxItems": 200,
"publishedAfter": "2026-01-01",
"includeComments": true
}

Output

One dataset item per post. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel, or pull it through the Apify API.

{
"postId": "-220754053_278663",
"ownerId": -220754053,
"text": "Попали под чары Лены Журавлёвой и даже не сопротивляемся…",
"postedAt": "2026-08-13T12:03:00.000Z",
"sourceUrl": "https://vk.com/wall-220754053_278663",
"stats": { "likes": 1240, "comments": 87, "reposts": 33, "views": 98000, "engagement": 1360 },
"mediaTypes": ["photo"],
"mediaCount": 6,
"attachments": [
{ "type": "photo", "id": "-220754053_457265754", "url": "https://vk.com/photo-220754053_457265754" }
],
"isRepost": false,
"repostChain": [],
"target": "https://vk.com/vkvideo",
"targetType": "url",
"scrapedAt": "2026-08-15T19:06:24.168Z"
}

Data fields

FieldDescription
postIdVK identifier as ownerId_postId.
ownerIdSigned ID of the wall (negative for communities).
author, authorIdWho wrote the post. Differs from the wall owner on community posts.
textPost body.
postedAt, editedAtISO-8601 timestamps in UTC.
sourceUrlCanonical vk.com link.
statslikes, comments, reposts, views, engagement.
mediaTypes, mediaCountAttachment types and how many.
attachmentsPhotos, videos, audio, docs, links and polls with VK object IDs and URLs.
isRepost, repostChainWhether the post reposts other content, and the originals.
commentsComment threads with replies, when enabled.
geo, isPinned, isAd, signerPost metadata.
target, targetTypeWhich input produced this row.
scrapedAtWhen it was extracted.

Extraction modes

Field availability differs by mode. This table is the honest version — check it before you rely on a field.

FieldHTML mode (no token)API mode (with token)
text, postedAt, sourceUrl
attachments with URLs and IDs✅ (plus sizes, durations, titles)
mediaTypes, isRepost, isPinned
stats (likes, views, comments)⚠️ often null
author, wallOwnernull
repostChain contents❌ empty
comments
Polls, geotags, signer, isAd
Whole wall depth⚠️ limited by VK
Private walls your token can read

HTML mode is a convenience tier. It is genuinely useful for text and media, but VK does not put engagement numbers in reliably-parseable public markup, so stats is frequently null. If you need engagement data, use a token.

Nothing is ever invented. A field VK does not provide is null, never a guess.

Getting an access token

  1. Create a standalone application at dev.vk.com.
  2. Open its settings and copy the service access key.
  3. Paste it into the VK access token field. It is stored encrypted and never appears in logs.

This takes about two minutes and needs no OAuth flow. For walls only a user account can read, generate a user token with the wall scope instead.

How much does it cost to scrape VK?

This Actor is billed by Apify platform usage (compute units, proxy traffic, storage). Runs are light: a browser is only launched in HTML mode, and API mode uses plain HTTP.

Rough guide from real runs:

  • 30 posts, HTML mode — around 15 seconds of a 4 GB run
  • 500 posts, API mode — a handful of HTTP requests, no browser

Keep costs down by setting maxItems to what you actually need, using a token so the run skips the browser entirely, and narrowing with publishedAfter.

Tips and advanced options

  • Use a token. It is faster, cheaper, more complete, and more reliable than HTML mode.
  • Raise the timeout when you raise maxItems. The run stops itself shortly before its timeout and keeps what it gathered, so a large maxItems on a short timeout returns a partial wall rather than an error. Both live in the run options.
  • Residential proxies matter. VK blocks most datacenter ranges, and rate-limits anonymous traffic per IP with a "not a robot" page. The Actor detects that page and retries from another exit, but a rotating residential pool is what makes those retries land. If runs fail to connect, set the proxy country to RU in Proxy configuration.
  • Date filters stop pagination early. publishedAfter halts the crawl once older posts appear, so a narrow window is much cheaper than a wide one.
  • Undated posts are dropped when a date filter is set, because they cannot be checked against it. Set keepUndatedPosts: true to keep them.
  • Scraping several communities? Put them all in vkTargets — one run, deduplicated across targets.
  • Schedule it. Use the Schedules tab for daily monitoring, and integrations to push results onward.

FAQ

Does this work without a VK account or token? Yes, in HTML mode — with the field limitations in the table above.

Why is stats null on some posts? VK does not expose engagement counts in parseable public markup consistently, and it renames the markup that does carry them without notice. Use an access token for reliable numbers.

The run failed saying VK served a bot challenge. What now? VK rate-limits anonymous traffic per IP and answers with a "not a robot" page. The Actor detects this and retries from a different proxy exit automatically. If every exit is refused, run again later, keep Proxy configuration on residential, or supply an accessToken — the official API is not rate-limited this way.

Why did I get fewer posts than I asked for? One of two things, and the run log always says which. Either VK stopped serving the wall — it limits how much it hands an anonymous visitor, and a token lifts that — or the run reached its time budget. The Actor stops itself just before the run timeout and keeps what it has collected rather than being killed with nothing to show, so raising Timeout in the run options collects more.

Are timestamps in my timezone? No — always UTC. In HTML mode, VK's displayed times are interpreted using htmlTimezone (Moscow by default) and converted to UTC.

Can it scrape private profiles? No. Only public walls, or walls the supplied token can legitimately read. This Actor does not bypass VK's access controls.

This Actor collects publicly available data only. You are responsible for how you use it, including compliance with VK's Terms of Service, GDPR, and any other applicable law. Scraping personal data may require a lawful basis — consult a lawyer if you are unsure. Do not use this Actor to collect personal data without a legitimate reason.

Found a bug or need a field that is missing? Open a ticket in the Issues tab. If you need a tailored VK dataset or a custom integration, get in touch through the same channel.