VK Posts Scraper
Pricing
$3.60 / 1,000 posts
VK Posts Scraper
Collect public VK wall posts and direct posts from profiles and communities. Get structured rows with text, authors, dates, engagement counts, media details, repost data, target types, and source links.
Pricing
$3.60 / 1,000 posts
Rating
5.0
(1)
Developer
Maxime Dupré
Maintained by CommunityActor stats
0
Bookmarked
254
Total users
64
Monthly active users
1.2 days
Issues response
2 days ago
Last modified
Categories
Share
🔎 Collect public VK posts as clean data
VK Posts Scraper helps researchers, analysts, and social media teams collect public VK posts. Give it handles, profile or community URLs, wall URLs, direct post URLs, or owner IDs. It returns one structured dataset row for each eligible public post, with text, author details, publication and edit times, engagement counts, media details, repost context, target types, and source links when VK provides them. This gives you structured data for research, comparison, and export.
- Collect posts from a public profile or community wall with VK wall post scraping.
- Pull posts from a chosen date range with VK historical posts scraping.
- Save public post fields for review or export with VK post data export.
- Compare public likes, comments, reposts, and views with VK engagement tracking.
- Review photo, video, clip, and link details with VK media metadata extraction.
- Follow copied post context with VK repost data extraction.
- Collect posts from several public walls in one run with VK multi-wall monitoring.
- Keep a structured copy of public posts with VK content archiving.
📦 See each public VK post in one structured row
Each saved row represents the first eligible match for one public VK post. The row keeps the submitted target that first found it, target type, stable post and owner IDs, canonical post URL, visible text, publication and edit times, post state, author details, engagement counts, media metadata, and copied-post context when VK provides them.
Row contents
targetandtargetTypeidentify the submitted target that first found the post.postId,ownerId, andsourceUrlprovide stable identity and the public post link.text,postedAt,editedAt,postType, andisPinneddescribe the post when VK exposes those values.authorholds public author ID, name, type, profile link, avatar, and verification status when available.engagementholds likes, comments, reposts, views, and reaction counts from VK.mediakeeps one entry per source attachment with its type and available links or details.repostholds the direct copied post and deeper copied-post context when VK provides it.
For attachment types that are not yet fully supported, media keeps the source type instead of dropping the attachment. If the same source post appears again through another submitted value, the later match is ignored. The saved row keeps the first target that found it, so no second row or post charge is created for that repeat. Private, deleted, hidden, unsupported, and no-result targets do not become rows.
🚀 Running the Actor
- Add public VK handles, profile or community URLs, wall URLs, direct post URLs, owner IDs, or community IDs.
- Set
maxItemsfor the whole run andmaxItemsPerTargetwhen you want a per-target cap. Leave either limit empty to collect all available matching posts until the relevant source is exhausted, subject to the other limit. - Add
publishedAfterandpublishedBeforeto keep wall posts in an inclusive date range. - Run the Actor and open the dataset.
For a date-filtered wall collection, the Actor checks older wall pages as needed to find posts in the chosen range. It does not require a VK login for public content.
⚙️ Input
Input fields
| Field | Type | What it does |
|---|---|---|
targets | array of strings | Required list of public VK handles, profile or community URLs, wall URLs, direct post URLs, owner IDs, or community IDs. Other text is treated as a keyword target, but VK may not show keyword results without a login. |
maxItems | integer | Sets the most posts to save across the whole run. Leave it empty to return all available matching posts until the submitted sources are exhausted, subject to any per-target limit. |
maxItemsPerTarget | integer | Sets the most posts to save for each submitted target. Leave it empty to return all available matching posts for each target until that source is exhausted, subject to the whole-run limit. |
publishedAfter | string | Keeps wall posts published on or after this date. The Actor checks older pages until it reaches this date or there are no more posts. |
publishedBefore | string | Keeps wall posts published on or before this date when VK provides a post date. |
Example input
This is the public input from a successful current-beta default-input run:
{"targets": ["durov"],"maxItems": 10}
🧾 Output
Run output link
The run output has one results link to the default dataset.
| Field | Type | What it does |
|---|---|---|
results | string | Opens the default dataset overview for saved public VK posts. |
Dataset rows
Each dataset row has one shape. Optional fields appear only when VK exposes them. repost.repost repeats the same repost shape for a deeper copied post.
| Field | Type | What it does |
|---|---|---|
target | string | Submitted target that first found the post. |
targetType | string | Kind of submitted VK target. |
postId | string | Stable owner-and-post ID for joining and deduplication. |
ownerId | integer | VK ID of the profile or community wall. |
sourceUrl | string | Public URL of the post. |
text | string | Visible post text. It can be empty for a media-only post. |
postedAt | string (date-time, optional) | Publication time from VK. |
editedAt | string (date-time, optional) | Last edit time from VK. |
postType | string (optional) | Post type reported by VK. |
isPinned | boolean (optional) | Whether VK marks the post as pinned. |
author | object | Public author details. |
author.id | integer | VK profile or community ID. |
author.name | string | Public profile or community name. |
author.type | string (optional) | Author kind: profile or community when VK provides it. |
author.profileUrl | string (optional) | Public author profile or community URL. |
author.avatarUrl | string (optional) | Public author image URL. |
author.isVerified | boolean (optional) | Whether VK marks the author as verified. |
engagement | object | Public counts and reaction details from VK. |
engagement.likes | integer | Number of likes. |
engagement.comments | integer | Number of comments. |
engagement.reposts | integer | Number of reposts. |
engagement.views | integer | Number of views. |
engagement.reactions | array of objects (optional) | Counts grouped by VK reaction type. |
engagement.reactions[].type | string | VK name for a reaction. |
engagement.reactions[].count | integer | Number of reactions of that type. |
media | array of objects | One entry for each source attachment, in source order. |
media[].type | string | Source attachment type. It stays present for unsupported attachment types. |
media[].id | integer (optional) | VK attachment ID. |
media[].ownerId | integer (optional) | VK ID of the attachment owner. |
media[].accessKey | string (optional) | VK key used to open the attachment. |
media[].albumId | integer (optional) | VK photo album ID. |
media[].url | string (optional) | Public source or destination URL. |
media[].playerUrl | string (optional) | Public video player URL. |
media[].title | string (optional) | Attachment title. |
media[].caption | string (optional) | Attachment caption. |
media[].text | string (optional) | Attachment text. |
media[].description | string (optional) | Attachment description. |
media[].postedAt | string (date-time, optional) | Attachment publication time. |
media[].duration | integer (optional) | Video length in seconds. |
media[].width | integer (optional) | Main image width in pixels. |
media[].height | integer (optional) | Main image height in pixels. |
media[].thumbnailUrl | string (optional) | Public preview image URL. |
media[].variants | array of objects (optional) | Useful image sizes supplied by VK. |
media[].variants[].url | string | Public image URL for this size. |
media[].variants[].width | integer (optional) | Image width in pixels. |
media[].variants[].height | integer (optional) | Image height in pixels. |
media[].variants[].type | string (optional) | VK name for this image size. |
repost | object (optional) | Direct copied parent post and any deeper copied-post context. |
repost.postId | string | Stable owner-and-post ID for the copied post. |
repost.ownerId | integer | VK ID of the wall with the copied post. |
repost.sourceUrl | string | Public URL for the copied post. |
repost.text | string | Visible copied post text. |
repost.postedAt | string (date-time, optional) | Copied post publication time. |
repost.author | object | Public author details for the copied post. |
repost.author.id | integer | Copied post author's VK ID. |
repost.author.name | string | Copied post author's public name. |
repost.author.type | string (optional) | Copied post author kind when VK provides it. |
repost.author.profileUrl | string (optional) | Public copied post author URL. |
repost.author.avatarUrl | string (optional) | Public copied post author image URL. |
repost.author.isVerified | boolean (optional) | Whether VK marks the copied post author as verified. |
repost.media | array of objects | Attachments in the copied post, in source order. Each entry uses the media[] fields above. |
repost.media[].type | string | Copied attachment type. |
repost.media[].id | integer (optional) | Copied attachment ID. |
repost.media[].ownerId | integer (optional) | VK ID of the copied attachment owner. |
repost.media[].accessKey | string (optional) | VK key used to open the copied attachment. |
repost.media[].albumId | integer (optional) | Copied photo album ID. |
repost.media[].url | string (optional) | Public copied attachment URL. |
repost.media[].playerUrl | string (optional) | Public copied video player URL. |
repost.media[].title | string (optional) | Copied attachment title. |
repost.media[].caption | string (optional) | Copied attachment caption. |
repost.media[].text | string (optional) | Copied attachment text. |
repost.media[].description | string (optional) | Copied attachment description. |
repost.media[].postedAt | string (date-time, optional) | Copied attachment publication time. |
repost.media[].duration | integer (optional) | Copied video length in seconds. |
repost.media[].width | integer (optional) | Copied main image width in pixels. |
repost.media[].height | integer (optional) | Copied main image height in pixels. |
repost.media[].thumbnailUrl | string (optional) | Public copied preview image URL. |
repost.media[].variants | array of objects (optional) | Image sizes supplied for the copied attachment. |
repost.media[].variants[].url | string | Public copied image URL for this size. |
repost.media[].variants[].width | integer (optional) | Copied image width in pixels. |
repost.media[].variants[].height | integer (optional) | Copied image height in pixels. |
repost.media[].variants[].type | string (optional) | VK name for this copied image size. |
repost.repost | object (optional) | A deeper copied post using this same repost shape. |
Example dataset row
This is a genuine, unshortened row from a successful current-beta run. The values and public source URL are copied from that dataset.
{"target": "https://vk.ru/vniissoktools","targetType": "wallUrl","postId": "-230816011_130","ownerId": -230816011,"sourceUrl": "https://vk.com/wall-230816011_130","text": "Воздуходувка аккумуляторная Vniissok V0041, бесщёточный двигатель, Li-Ion аккумулятор 4 Ач\n\n💨Бесщёточный мотор — надёжно и надолго.\n\n💨Без проводов — полная свобода на участке.\n\n💨Мощный поток — листва исчезает за минуты.\n\n💨Лёгкая и удобная — руки не устают.\n\n💨Компактная — хранить одно удовольствие.","author": {"id": -230816011,"name": "VNIISSOK ИНСТРУМЕНТЫ","type": "community","profileUrl": "https://vk.com/vniissoktools","avatarUrl": "https://sun1-83.userapi.com/s/v1/ig2/how5aAwbD9TUaBSI6S2u0fqCDSggqG6xkuVHia60_qYU8m2EM6j_Lm5U4d9mm1ov2bNiPcQ3po6VWYxLrwGoaAq2.jpg?quality=95&crop=45,45,655,655&as=32x32,48x48,72x72,108x108,160x160,240x240,360x360,480x480,540x540,640x640&ava=1&u=jmyHaWC6JhKEsA8N48Z6V2eeSVileDHC61dCz2oAFuo&cs=100x100","isVerified": false},"engagement": {"likes": 3,"comments": 0,"reposts": 0,"views": 52,"reactions": [{"type": "0","count": 3}]},"media": [{"type": "video","id": 456239311,"ownerId": -230816011,"url": "https://vk.com/video-230816011_456239311","title": "Clip by @vniissoktools","description": "Осень — самое время обзавестись воздуходувкой: горы листвы на участке больше не будут проблемой! Аккумуляторная бесщёточная воздуходувка VNIISSOK V0041 — отличный выбор: мощный поток воздуха быстро очистит дорожки, газон и зону вокруг дома...","duration": 34,"postedAt": "2026-09-08T09:07:54.000Z","width": 1080,"height": 1920,"thumbnailUrl": "https://iv.okcdn.ru/videoPreview?id=19741364324932&idx=1&type=43&tkn=UWSkzjH3BdjW4wsVz18E1VnFWMU&cs=1080x1920","variants": [{"url": "https://iv.okcdn.ru/videoPreview?id=19741364324932&idx=1&type=39&tkn=GKCGBzwMsAjlRs3UhZ6GCgWQsGU&fn=vid_u&cs=320x569","width": 320,"height": 569},{"url": "https://iv.okcdn.ru/videoPreview?id=19741364324932&idx=1&type=39&tkn=GKCGBzwMsAjlRs3UhZ6GCgWQsGU&fn=vid_u&cs=720x1280","width": 720,"height": 1280},{"url": "https://iv.okcdn.ru/videoPreview?id=19741364324932&idx=1&type=39&tkn=GKCGBzwMsAjlRs3UhZ6GCgWQsGU&fn=vid_u&cs=405x720","width": 405,"height": 720},{"url": "https://iv.okcdn.ru/videoPreview?id=19741364324932&idx=1&type=43&tkn=UWSkzjH3BdjW4wsVz18E1VnFWMU&cs=405x720","width": 405,"height": 720},{"url": "https://iv.okcdn.ru/videoPreview?id=19741364324932&idx=1&type=43&tkn=UWSkzjH3BdjW4wsVz18E1VnFWMU&cs=135x240","width": 135,"height": 240},{"url": "https://iv.okcdn.ru/videoPreview?id=19741364324932&idx=1&type=43&tkn=UWSkzjH3BdjW4wsVz18E1VnFWMU&cs=720x1280","width": 720,"height": 1280},{"url": "https://iv.okcdn.ru/videoPreview?id=19741364324932&idx=1&type=43&tkn=UWSkzjH3BdjW4wsVz18E1VnFWMU&cs=1080x1920","width": 1080,"height": 1920}]},{"type": "action_button"}],"postedAt": "2026-09-08T09:08:24.000Z","editedAt": "2026-09-08T09:10:33.000Z","postType": "post"}
💳 Pricing
Charged outcome
This Actor uses pay-per-event pricing. The primary event is one public VK post saved to the dataset. No-result, inaccessible, private, hidden, unsupported, and duplicate matches are not saved as public post events. There is no separate Actor-start charge.
🔌 Integrations
Connect your data
Use the Apify API to start runs and read dataset items. Schedule runs, send finished runs to webhooks, or use supported Apify integrations to move rows to other tools. Export the dataset as JSON, CSV, Excel, XML, RSS, or HTML.
❓ FAQ
What happens when the same post is found twice?
The first eligible occurrence is saved. If another submitted handle, URL, or ID finds it later, that match is ignored. target keeps the first value that found the saved row, and the repeat does not create another row or post charge.
Are date filters inclusive?
Yes. publishedAfter includes posts on that date and later. publishedBefore includes posts on that date and earlier when VK provides a post date. They apply to outer wall posts, not dates inside repost. The Actor checks older wall pages as needed.
What if a target is private or returns no posts?
No row is saved for private, login-only, deleted, hidden, unsupported, inaccessible, or no-result targets. The Actor is for public VK content and does not require a VK login.
What happens if one target cannot be reached?
Rows already saved stay in the dataset, and later independent targets are still checked. If unresolved source instability blocks all remaining truthful work, the run can fail with the saved rows preserved.
Does the Actor download media files?
No. It returns public links and named metadata for supported photos, videos, clips, and links. Other attachment types keep their source type when they cannot be fully normalized.
What does repost contain?
When VK exposes copied-post context, repost includes the copied post ID, source URL, text, author, publication time, media, and a deeper copied-post chain.
Which output values can be missing?
Optional values appear only when VK provides them. A media-only post can have empty text, and attachment arrays can be empty.
Can I collect several VK walls in one run?
Yes. Put multiple same-kind public values in targets. The Actor saves each eligible post once and keeps the first submitted value that found it.
How do the post limits work?
maxItems caps the whole run. maxItemsPerTarget caps each submitted target. Leave a limit empty to return all available matching posts until the relevant source is exhausted, subject to the other limit.
Can I run it through the Apify API?
Yes. Start the Actor through the Apify API and read the default dataset through its API link. The public input and output fields stay the same.
Can I collect posts without a VK login?
Yes, for publicly accessible VK content. Private or login-only content is outside the Actor's scope.
📝 Changelog
v1.0 (10-09-2026)
- Startup logs no longer show dependency and runtime details before the first public message.
- Dataset rows omit collection timestamps and unknown author types when VK does not provide them.
v0.0
- Restored
targetTypeandscrapedAt. - Added named repost and richer media data.
- Date filters can search older wall pages.
- Runs resume after an Apify migration without repeating saved posts or post charges.
- Duplicate posts are not saved or charged.
- Saved rows remain when one target fails.
includeRawPost,rawPost,matchedKeywords, andengagement.totalremain unsupported.
v0.0
- Initial release.
🆘 Support
For issues, questions, or feature requests, file a ticket and I'll fix or implement it in less than 24h 🫡
🔗 Related Actors
- Facebook User Post Extractor: Compare public Facebook profile and Page posts with VK post data.
- Twitter Scraper: Collect public X posts and engagement alongside VK sources.
- Telegram Channel Messages Scraper: Collect public Telegram channel messages for cross-platform monitoring.
- Reddit Scraper: Collect public Reddit posts and comments for topic research with VK posts.
- Substack Notes Scraper: Compare public Substack Notes with VK posts and social conversations.
Made with ❤️ by Maxime Dupré