VK Scraper avatar

VK Scraper

Pricing

$2.88 / 1,000 results

Go to Apify Store
VK Scraper

VK Scraper

Collect public VK wall posts and direct posts from handles, URLs, and owner IDs. Export text, dates, authors, engagement, attachments, and repost context with date and count limits.

Pricing

$2.88 / 1,000 results

Rating

0.0

(0)

Developer

MLG Data

MLG Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

17 hours ago

Last modified

Share

Scrape public VK wall posts from a handle, community, profile, wall URL, owner ID, or direct post link. Export VK post data to JSON, CSV, or Excel with text, dates, public author details, engagement counts, attachments, and repost context. This is a practical VK API alternative for public post collection without supplying a personal login.

A run saves one dataset row per unique post. It uses structured public responses, follows older wall pages when needed, and stops at the total or per-target limit you choose. Private material and content that requires a login are outside its scope.

What data can you extract from VK?

The output keeps a stable top-level shape. Optional fields are omitted when the source does not provide them. A media-only post may have an empty text value; a post without attachments has an empty media array.

FieldDescriptionExample
targetSubmitted value that first found the post"-230816011"
targetTypeHow that value was recognized"ownerId"
postIdStable owner and post identifier for joins and deduplication"-230816011_143"
ownerIdWall owner ID; community IDs are negative-230816011
sourceUrlCanonical public post linkhttps://vk.com/wall-230816011_143
textVisible post text, including line breaks"Как ни рассказывай..."
postedAtUTC publication time"2026-09-25T11:05:03.000Z"
editedAtUTC edit time, if exposed"2026-09-25T11:05:57.000Z"
postTypeSource post type"post"
isPinnedWhether the wall marks the post as pinnedtrue
authorPublic profile or community recordObject
author.idAuthor ID, negative for a community-230816011
author.namePublic display name"Public community"
author.typeProfile or community"community"
author.profileUrlPublic author pagehttps://vk.com/club230816011
author.avatarUrlPublic avatar link, when suppliedImage URL
author.isVerifiedSource verification flag, when suppliedfalse
engagementPublic interaction and view countersObject
engagement.likesLikes shown by the source2
engagement.commentsComments count shown by the source0
engagement.repostsRepost count shown by the source0
engagement.viewsView count shown by the source20
engagement.totalLikes plus comments plus reposts2
engagement.reactionsCounts by the source reaction IDArray
engagement.reactions[].typeReaction ID as text"0"
engagement.reactions[].countCount for that reaction2
mediaAttachments in their original orderArray
mediaCountNumber of source attachments2
media[].typeAttachment type, including types without a detailed mapping"video"
media[].idSource attachment ID456239316
media[].ownerIdAttachment owner ID-230816011
media[].accessKeyPublic access key when suppliedString
media[].albumIdSource album ID when suppliedInteger
media[].urlPublic attachment or destination linkhttps://vk.com/video-230816011_456239316
media[].playerUrlPublic player link when suppliedURL
media[].titleAttachment title"Video title"
media[].captionLink captionString
media[].textAttachment textString
media[].descriptionAttachment descriptionString
media[].postedAtAttachment publication time in UTC"2026-09-25T11:04:28.000Z"
media[].durationDuration in seconds86
media[].widthMain image width in pixels1080
media[].heightMain image height in pixels1920
media[].thumbnailUrlPublic preview imageURL
media[].variantsPublic image sizes supplied by the sourceArray
media[].variants[].urlURL for one image sizeURL
media[].variants[].widthPixel width for that sizeInteger
media[].variants[].heightPixel height for that sizeInteger
media[].variants[].typeSource size label when supplied"x"
repostDirect copied-post context, if presentObject
repost.postIdStable ID of the copied postString
repost.ownerIdCopied post wall ownerInteger
repost.sourceUrlPublic copied-post linkURL
repost.textCopied post textString
repost.postedAtCopied post publication timeUTC timestamp
repost.authorPublic copied-post author, with the author fields aboveObject
repost.mediaCopied-post attachments, with the media fields aboveArray
repost.repostAnother copied-post level, if suppliedObject

The repost chain is limited to three levels. Its nested author and media objects use the same field definitions as the outer post. Attachment arrays can include a simple type value for a source format that has no matching detail fields. This keeps the fact that an attachment existed instead of silently removing it.

The engagement.total field is a convenience sum of likes, comments, and reposts. It does not include views, and reaction counts are already represented in likes. Engagement is a snapshot taken during the run, not a historical series. Run the same wall again later if you need to measure change.

How to scrape VK

  1. Enter one or more public targets. For a community, use its handle, public URL, or negative numeric owner ID. You can also enter a direct post URL when you need a single post.
  2. Set maxItems for the whole run and, if collecting several walls, maxItemsPerTarget for each submitted value. The default total cap is 100 posts.
  3. Add publishedAfter or publishedBefore if you need a UTC publication-date range. Both bounds include the specified date.
  4. Start the run. The actor reads public structured responses and saves each unique eligible post once.
  5. Open the default dataset to inspect rows or download JSON, CSV, or Excel. The results output link points to the same dataset.

A direct post link returns at most one row. A wall target can return multiple pages until its public posts are exhausted or a configured limit is reached. The actor checks targets in their submitted order. If two targets lead to the same post, target and targetType reflect the first one that yielded it.

Input

ParameterTypeDefaultDescription
targetsstring arrayRequired; example ["-230816011"]Public handles, profile or community URLs, wall URLs, direct post URLs, or numeric owner IDs.
maxItemsinteger100Maximum unique rows for the whole run. Set 0 for no total cap.
maxItemsPerTargetinteger0Maximum rows saved for each target. Set 0 for no per-target cap.
publishedAfterdate stringUnsetInclude posts published on or after this UTC date, YYYY-MM-DD.
publishedBeforedate stringUnsetInclude posts published on or before this UTC date, YYYY-MM-DD.
proxyConfigurationobjectPublic proxy enabledConnection configuration for public requests.

A realistic wall collection input is:

{
"targets": ["-230816011"],
"maxItems": 40
}

For a single item, set targets to a public post URL such as https://vk.com/wall-230816011_143 and maxItems to 1. To compare two public walls, put both values in the array and add a per-target cap. Numeric positive IDs refer to profiles; negative IDs refer to communities. A club or public ID also refers to a community.

Date filters apply to the outer wall post. They do not filter a copied post inside repost, because that copied item may have a different publication date. The actor reads older pages to find eligible posts after the requested lower bound. A narrow range on a large wall can therefore involve several public page requests before it saves a row.

Output example

The following is an excerpt of a real row from a 40-post validation run on 26 September 2026. The long text and attachment details are shortened for readability; author identity is omitted here. The IDs, dates, counts, links, and attachment types are from that run.

{
"target": "-230816011",
"targetType": "ownerId",
"postId": "-230816011_143",
"ownerId": -230816011,
"sourceUrl": "https://vk.com/wall-230816011_143",
"text": "Как ни рассказывай про сварочный инвертор...",
"postedAt": "2026-09-25T11:05:03.000Z",
"editedAt": "2026-09-25T11:05:57.000Z",
"postType": "post",
"author": {
"id": -230816011,
"type": "community"
},
"engagement": {
"likes": 2,
"comments": 0,
"reposts": 0,
"views": 20,
"total": 2,
"reactions": [{"type": "0", "count": 2}]
},
"media": [
{
"type": "video",
"id": 456239316,
"ownerId": -230816011,
"url": "https://vk.com/video-230816011_456239316",
"postedAt": "2026-09-25T11:04:28.000Z",
"duration": 86,
"width": 1080,
"height": 1920
},
{"type": "action_button", "title": "View products", "url": "https://vk.ru/market-230816011"}
],
"mediaCount": 2
}

In the validation run, all 40 rows had a post ID, owner ID, source URL, publication time, public author name, and likes count. Thirty-nine had nonempty text; one public post was media-led. Optional edit times, verification flags, and media details depend on what the source exposes for a particular post.

Use cases

  • Community monitoring: Save the latest public posts from several communities and compare their publishing cadence, topic mix, and visible engagement.
  • Editorial research: Collect public post text and source links for a dated period, then review the original page for context before citing it.
  • Campaign measurement: Take repeated snapshots of likes, comments, reposts, and views on public campaign posts. Use postId to join the snapshots outside the dataset.
  • Media inventory: Find the public photo, video, clip, link, and other attachment types a community uses. mediaCount and media[].type support quick grouping.
  • Repost tracing: Review repost.sourceUrl and its author to identify where public copied content came from, when the source supplies a copy history.
  • Export and audit: Keep a dated export of public posts for a permitted research or reporting workflow, with canonical links back to each original post.

For monitoring, schedule a bounded run such as 40 or 100 posts per wall at a regular interval. The actor deduplicates within one run. It does not keep a persistent cross-run history, so use postId as the key in your own destination if you combine multiple runs.

How much does it cost to scrape VK?

The configured price is $2.88 per 1,000 saved posts, or $0.00288 for one saved dataset row. The charged event is one public post delivered to the dataset. A skipped, unavailable, or duplicate post does not create a saved row. The run stops when its configured item cap or the caller's event budget is reached.

Saved postsPost-event calculationPost-event price
4040 × $0.00288$0.1152
500500 × $0.00288$1.44
5,0005,000 × $0.00288$14.40

These examples assume that many eligible public posts are available. Setting maxItems to 5,000 is a ceiling; it does not create 5,000 results from a wall with fewer public posts. Platform resource usage and any account-specific charges are shown in the run details. Public access and proxy availability can also affect whether a requested count is reachable.

Tips for best results

Use a numeric owner ID or a direct wall URL when you already know it. A handle is also supported, but it takes one public identity lookup before the wall can be read. A direct post URL is the most precise choice for one known post. Submitting several aliases for the same wall will not increase the number of unique rows, because duplicate post IDs are saved once per run.

Start with a modest maxItems to check a target's public availability and expected fields. For several walls, set maxItemsPerTarget if you want a balanced sample; otherwise the first wall can fill the whole-run cap. Put the targets you care about most first, since the run processes them in order.

For recent-post monitoring, set publishedAfter to a known UTC date and keep the total cap realistic. The actor pages through the wall from its current public order. Very old ranges on a large wall can require many requests. A pinned older post may appear near the front; date filtering evaluates its actual publication date.

Use sourceUrl to inspect a post in context. The dataset records fields from the public response at run time. View counts and reaction totals may change later, and the source can remove or restrict a post after collection. Keep your own collection date alongside exported data if you need time-series comparisons.

Limits

This actor collects public wall posts and direct posts. It does not authenticate to a personal account, open private walls, read login-only keyword search results, collect comments as separate rows, or download media files. URLs in media point to public source assets or destinations when supplied. Some attachment formats expose only a type; some video and image URLs can expire or change.

The public response may omit an edit time, pinned flag, verification flag, player link, or author image. A missing optional field is omitted from the row. A post with an image or video can have empty visible text. Counters are the values made public to an anonymous viewer and may differ from counts visible to a signed-in account.

Public access is subject to the site's rate limits and availability. The actor retries temporary rate and server errors, refreshes its anonymous token when needed, and can continue to later independent targets if one target fails. If no public posts can be collected, the run fails rather than presenting an empty dataset as a successful scrape. Pagination has been observed beyond offset 1,000; total reach still depends on what the public endpoint returns for a given wall.

Use with automated agents

An agent that can start a run and read the dataset can use the input and output schemas directly. Keep the requested target and result limit explicit, then join returned rows on postId when comparing runs.

  • “Collect up to 40 recent public posts from owner ID -230816011 and list the ten with the most reposts, including their source links.”
  • “Fetch this public wall for posts published since 2026-09-01, export the post IDs and dates, and summarize the attachment types.”

The row contains the original target, stable post identity, canonical link, and the public counters needed for a follow-up workflow. It does not make claims about sentiment, reach, or audience identity.

FAQ

The actor reads publicly available material. Your intended use still needs to respect applicable law, the site's terms, copyright, privacy rules, and any requirements for personal data. Do not use public profile details to target or misuse individuals.

Do I need a VK login or my own token?

No personal login or user token is part of the input. The actor obtains short-lived anonymous public access for each run. If a wall or post requires authentication, it is outside the supported scope.

Do I need to configure a proxy?

The default public connection is already configured. Most users can leave proxyConfiguration alone. If the public source is temporarily unavailable from a connection, the run may retry or move to another available proxy route.

How fast is a run?

The 40-post validation run completed in about eight seconds. Larger runs take longer because wall pages are requested in batches, especially when a date range requires scanning older pages. Source response time and retries can change the result.

Can I schedule monitoring?

Yes. Schedule a run with a bounded input and store its dataset in your destination. Match posts across runs by postId, then compare the saved engagement snapshots. The actor does not itself calculate change across runs.

Can I export to a spreadsheet?

Yes. Download the default dataset as CSV or Excel, or send the rows to a spreadsheet integration. Nested author, engagement, media, and repost objects are easiest to preserve in JSON; flatten them in your destination if you need one column per nested value.

Why is a field empty or missing?

The public source did not supply that value for the post. Media-only posts can have empty text, while an unedited post may have no editedAt. If a post or wall becomes private or inaccessible, it may yield no row.

Integrations

The default dataset can be read through the platform API, scheduled runs, webhooks, and supported automation integrations. Use sourceUrl for links to original posts, postId for deduplication, and the nested public fields for downstream reporting. JSON preserves every structured field; CSV and Excel suit tabular summaries after you select the columns you need.

Support

Open an issue on the Issues tab; we reply within 24h and add fields on request.