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
443
Total users
116
Monthly active users
4.7 days
Issues response
7 days ago
Last modified
Categories
Share
🔎 Collect public VK posts as structured data
VK Posts Scraper helps researchers, analysts, and social media teams collect public VK posts. Give it public handles, profile or community URLs, wall URLs, direct post URLs, owner IDs, or community IDs. It returns one structured dataset row for each public post it saves. Each row can include the post text, author details, dates, engagement counts, media details, copied-post details, comments, and a link to the post. 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, and link details with VK media metadata extraction.
- Follow copied post context with VK repost data extraction.
- Keep a structured copy of public posts with VK content archiving.
- Filter posts by a word or phrase with VK post keyword filter.
- Save public top-level comments for each post with VK comments scraper.
- Watch several VK walls in one run with VK multi wall monitoring.
📦 See each public VK post in one structured row
Each saved row is the first match for one public VK post. The row keeps the submitted value that first found it and its targetType. It also keeps stable post and owner IDs, the post link, visible text, the publication time, pinned state, and author details. It adds the edit time, engagement counts, media details, copied-post details, and comments when VK provides them. Post text is plain text, with links shown as ordinary web addresses.
Row contents
targetandtargetTypeidentify the submitted value that first found the post.postId,ownerId, andsourceUrlprovide stable identity and the public post link.text,postedAt, andisPinneddescribe the post.editedAtappears when VK provides it.authorholds public author ID, name, type, profile link, avatar, and verification status when available.engagementholds likes, comments, reposts, views, and reaction counts from VK. Reaction counts use VK's reaction names, such asLikeorHaha.mediakeeps one entry per source attachment with its type and available links or details.repostholds the post this post copied, plus one more copied post inside it when VK provides it.commentsholds up to 100 public top-level comments for each post, when VK shows them.
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 submitted value that found it, so no second row or post charge is created for that repeat. Private, deleted, hidden, unsupported, and no-result submitted values do not become rows. A post with no visible text, no attachment, and no copied post is not saved. Each saved post was published on the page it is saved under, so a pinned post or repost from another page does not become a row.
🚀 Running VK Posts Scraper
- Add public VK handles, profile or community URLs, wall URLs, direct post URLs, owner IDs, or community IDs.
- Set
maxItemsfor the whole run, and setmaxItemsPerTargetwhen you want a cap for each submitted value. Leave either limit empty to collect all available matching posts until the relevant source is exhausted, subject to the other limit. - Add
publishedAfterandpublishedBeforeasYYYY-MM-DDdates to keep wall posts in an inclusive UTC date range. - Turn off
includePinnedPostsorincludeRepostsif you want to skip pinned posts or reposts. - 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. |
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 maxItemsPerTarget limit. |
maxItemsPerTarget | integer | Sets the most posts to save for each submitted value. Leave it empty to return all available matching posts for each submitted value until that source is exhausted, subject to the whole-run limit. |
publishedAfter | string | Use a real YYYY-MM-DD date. Keeps wall posts published on or after the start of this date in UTC. Only the wall post's own date is checked, not the date of a copied post inside it. The Actor checks older pages until it reaches this date or there are no more posts. |
publishedBefore | string | Use a real YYYY-MM-DD date. Keeps wall posts published through the end of this date in UTC or earlier. Only the wall post's own date is checked, not the date of a copied post inside it. |
containsText | string | Keeps only posts whose own text contains this word or phrase. Leave it empty to skip this filter. The text of a copied post is not checked. |
includePinnedPosts | boolean | Keep it on to save pinned posts. Turn it off to skip them. Pinned posts still follow the word and date filters. The default is on. |
includeReposts | boolean | Keep it on to save reposts, which are posts a page shares from another post. Turn it off to skip them. The default is on. |
DD.MM.YYYY is not supported. For example, use 2026-09-17, not 17.09.2026.
Example input
This is an example input from a successful run:
{"targets": ["durov"],"includePinnedPosts": true,"includeReposts": true,"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 saved row is one public post. Optional fields appear only when VK provides them. Copied posts and comments are nested inside the row.
| Field | Type | What it does |
|---|---|---|
target | string | Submitted value that first found the post. |
targetType | string | Kind of submitted value, such as handle, wallUrl, postUrl, or ownerId. |
postId | string | VK's stable owner-and-post ID. Use it to match the same post across exports. |
ownerId | integer | VK ID of the profile or community wall. |
sourceUrl | string | Public VK URL for the post. |
text | string | Post text as plain text, with links shown as ordinary web addresses. It is empty for a media-only post. |
postedAt | string (date and time) | Publication date and time from VK. |
editedAt | string (date and time, optional) | Date and time when VK last edited the post. |
isPinned | boolean | true when VK marks the post as pinned. false when it does not. |
author | object | Public details of the profile or community that wrote the post. |
author.id | integer | VK profile or community ID. |
author.name | string | Public profile or community name. If VK gives no name, this shows an ID form such as id123 or club123. |
author.type | string (optional) | profile or community, when VK provides it. |
author.profileUrl | string | Public VK 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 (optional) | Public counts from VK, when VK shows them. |
engagement.likes | integer (optional) | Number of likes, when VK shows it. |
engagement.comments | integer (optional) | Number of comments on the post, when VK shows it. |
engagement.reposts | integer (optional) | Number of reposts, when VK shows it. |
engagement.views | integer (optional) | Number of views, when VK shows it. |
engagement.reactions | array of objects (optional) | Counts by reaction type, when VK shows them. |
engagement.reactions[].type | string | VK's name for this reaction, such as Like, Haha, Wow!, Love, or Sad. The counts for all types add up to engagement.likes. |
engagement.reactions[].count | integer | Number of reactions of this type. |
media | array of objects | One entry for each source attachment, in source order. |
media[].type | string | Source attachment type, such as photo, video, or link. 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 and time, optional) | Attachment publication date and 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) | Image sizes that VK supplies. Each image URL appears once. |
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) | The post this post copied. Its fields are in the Copied post table below. |
comments | array of objects (optional) | Public top-level comments saved for this post, up to 100. Replies are not included. |
comments[].author | object | Public details of the profile or community that wrote the comment. |
comments[].author.id | integer | Commenter's VK profile or community ID. |
comments[].author.name | string | Commenter's public name. If VK gives no name, this shows an ID form such as id123 or club123. |
comments[].author.type | string (optional) | profile or community, when VK provides it. |
comments[].author.profileUrl | string | Public commenter profile or community URL. |
comments[].author.avatarUrl | string (optional) | Public commenter image URL. |
comments[].author.isVerified | boolean (optional) | Whether VK marks the commenter as verified. |
comments[].text | string | Visible comment text. It can be empty. |
comments[].postedAt | string (date and time) | Comment publication date and time from VK. |
comments[].likes | integer | Number of likes on the comment. |
Example dataset row
This is a complete example row from a successful run. Its values are copied from that run's dataset.
{"target": "durov","targetType": "handle","postId": "1_2037108","ownerId": 1,"sourceUrl": "https://vk.com/wall1_2037108","text": "Согласен с Юрием: русские технологии – лучшие. Жаль, что из-за непродуманных законов русское не всегда конвертируется в российское. \n\nПока на локальном уровне будут существовать ограничения и риски, бизнес будет уходить в те юрисдикции, где их нет. Надеюсь, когда-нибудь эти ограничения будут сняты, и Россия сможет занять в мире свое подобающее место – место глобального технологического лидера.","isPinned": false,"author": {"id": 1,"name": "Pavel Durov","profileUrl": "https://vk.com/durov","type": "profile","avatarUrl": "https://sun9-81.userapi.com/s/v1/ig1/2GR_vzJCKZs-MYxN22VujC9ldMWNzEFV85GLUiCqtyQJB7cmrDxAofgPD5-fsrtjzhDOpkjSu4hhTw.jpg?quality=96&crop=514,119,337,337&blur=5,10&as=32x32,48x48,72x72,108x108,160x160,240x240&ava=1&u=6zicIh_ZpqL-m0bfrx3oQaK2aDKPAOT0z40MnNsH_H0&cs=100x100","isVerified": true},"engagement": {"likes": 22988,"comments": 0,"reposts": 687,"views": 4676850,"reactions": [{"type": "Like","count": 22979},{"type": "Haha","count": 1},{"type": "Wow!","count": 2},{"type": "Love","count": 1},{"type": "&$#%!","count": 2},{"type": "Sad","count": 3}]},"media": [{"type": "video","id": 456239019,"ownerId": 1,"accessKey": "2e81142e54754b49c1","url": "https://vk.com/video1_456239019","playerUrl": "https://vkvideo.ru/video_ext.php?oid=1&id=456239019&hash=0f666b27c3f51361&__ref=vk.web2","title": "Юрий Дудь про русское","duration": 7,"postedAt": "2017-10-08T18:20:12.000Z","width": 852,"height": 466,"thumbnailUrl": "https://sun9-84.userapi.com/s/v1/ig1/cpxPrfLm60kF5v8Xv5vDGDBC-5U9GIuaTWleEcxAE22wBcxEGfmjwlfMSMMBw5b5n1uO_-2W.jpg?quality=96&size=800x450","variants": [{"url": "https://sun9-84.userapi.com/s/v1/ig1/MNHkVBzBkH_kDraGF9pdweuXyfX4ZPd74WXQ1D1BrhEbsdKdJExlkR772fDYsRenHL5TGnWf.jpg?quality=96&size=60x34","width": 60,"height": 34},{"url": "https://sun9-84.userapi.com/s/v1/ig1/wq-SkJYyxmxYbYEXt3-xl2bOrOj6uck-k3C6_TJxZOqVVyk2ZdozNqh0WQGc_SyE679e2tAM.jpg?quality=96&size=130x73","width": 130,"height": 73},{"url": "https://sun9-84.userapi.com/s/v1/ig1/XCiG8EojWYIpF1MIqLC-j2nnxqe3gYcn8WCFy8tZtdb6C9h04rm3fTVS63feHuZwM75vtZ7w.jpg?quality=96&size=160x90","width": 160,"height": 90},{"url": "https://sun9-84.userapi.com/s/v1/ig1/FuE1afA_pyO-B6fkfjp69moPvoRvRp_qe5nTqP9nT7YRooGVqLnt7YWg7jmCmGOUL6T4rPp9.jpg?quality=96&size=320x180","width": 320,"height": 180},{"url": "https://sun9-84.userapi.com/s/v1/ig1/nG9LbzrB-J2tfu81_islXG9aoPIL97KsZ827_HyvV58wtHeA1xksKgD-rC-qeagM7EAp9Neh.jpg?quality=96&size=450x253","width": 450,"height": 253},{"url": "https://sun9-84.userapi.com/s/v1/ig1/cpxPrfLm60kF5v8Xv5vDGDBC-5U9GIuaTWleEcxAE22wBcxEGfmjwlfMSMMBw5b5n1uO_-2W.jpg?quality=96&size=800x450","width": 800,"height": 450},{"url": "https://sun9-84.userapi.com/s/v1/ig1/4r3WxQQ4YEi2ACAL3fovlCh_7tkD2hLVldAL8WwTlfmxaUIL2GDD6Qb1028xzKkMvmo8UpAf.jpg?quality=96&size=720x405","width": 720,"height": 405},{"url": "https://sun9-49.userapi.com/s/v1/ig2/yBizfr4hWmQYqsJOMuSJaf8pv8tRJOKvOEtmWl1adEhm39ELnlKkMo2mf-CGE4x28UHuOE_4mFyjbS2nSZNsogFV.jpg?quality=96&size=60x33","width": 60,"height": 33},{"url": "https://sun9-49.userapi.com/s/v1/ig2/CMmOLCTFQDcG1wauRNJChWtKR5sJfMSqSI7Lg0oMSrmJ7a42Wlz0oyVDoesa0IkNtIfwIcxDe0xYyqBchW0h7hmz.jpg?quality=96&size=130x71","width": 130,"height": 71},{"url": "https://sun9-49.userapi.com/s/v1/ig2/cq1JTqNrLqTuBlv12-7bTsS0gG3UJODWNwJApYgAjlQo6_326J_tZCaE_R0oYf3Cw2hMBwEgXuXeMxqplEypDsmN.jpg?quality=96&size=160x88","width": 160,"height": 88},{"url": "https://sun9-49.userapi.com/s/v1/ig2/KbnZ_kO_M-KE-Hqf5ib67uUY3FYVpH6sCfD1sjH4Gu2zGs3D7WmDbiYCBvHs8d1nMKYt9SvUCnqENdkTf1yuQNW8.jpg?quality=96&size=320x175","width": 320,"height": 175},{"url": "https://sun9-49.userapi.com/s/v1/ig2/A4sb5fAfYa6F_PYRroDpeE4tw80nMCdOngV2sdda9waDsVrdJWgVW_mZHjj7dkxuqn4sHnzwJYzApqHNfmNRCWq2.jpg?quality=96&size=450x246","width": 450,"height": 246},{"url": "https://sun9-49.userapi.com/s/v1/ig2/K9ZX7TZXbmqOxlGnVA0INMYrkM4y6FuFYaZBwwO3QwfwpjiAwfwvx-cNloDVcZj7rNArS26CDGxxneYgWuNCy8Ki.jpg?quality=96&size=800x438","width": 800,"height": 438},{"url": "https://sun9-49.userapi.com/s/v1/ig2/RrkqD5NGmI5M_CdMPWSUC5GtTz2QqJoTaX4UpXohMhsP6mjW40L4i6K7gvEWMyKIr4MXPZz6Nn93P179Yg4urvet.jpg?quality=96&size=720x394","width": 720,"height": 394}]}],"postedAt": "2017-10-08T18:50:06.000Z","editedAt": "2017-10-08T19:09:48.000Z"}
Copied post (repost)
A copied post has its own text, author, and attachments. It has no engagement counts, pinned flag, or comments.
| Field | Type | What it does |
|---|---|---|
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 VK URL for the copied post. |
repost.text | string | Copied post text as plain text, with links shown as ordinary web addresses. |
repost.postedAt | string (date and time, optional) | Publication date and time of the copied post. |
repost.author | object | Public author details for the copied post. |
repost.author.id | integer | Copied post author's VK profile or community ID. |
repost.author.name | string | Copied post author's public name. |
repost.author.type | string (optional) | profile or community, when VK provides it. |
repost.author.profileUrl | string | Public URL of the copied post author. |
repost.author.avatarUrl | string (optional) | Public image URL of the copied post author. |
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. |
repost.media[].type | string | Source attachment type, such as photo, video, or link. It stays present for unsupported attachment types. |
repost.media[].id | integer (optional) | VK attachment ID. |
repost.media[].ownerId | integer (optional) | VK ID of the attachment owner. |
repost.media[].accessKey | string (optional) | VK key used to open the attachment. |
repost.media[].albumId | integer (optional) | VK photo album ID. |
repost.media[].url | string (optional) | Public source or destination URL. |
repost.media[].playerUrl | string (optional) | Public video player URL. |
repost.media[].title | string (optional) | Attachment title. |
repost.media[].caption | string (optional) | Attachment caption. |
repost.media[].text | string (optional) | Attachment text. |
repost.media[].description | string (optional) | Attachment description. |
repost.media[].postedAt | string (date and time, optional) | Attachment publication date and time. |
repost.media[].duration | integer (optional) | Video length in seconds. |
repost.media[].width | integer (optional) | Main image width in pixels. |
repost.media[].height | integer (optional) | Main image height in pixels. |
repost.media[].thumbnailUrl | string (optional) | Public preview image URL. |
repost.media[].variants | array of objects (optional) | Image sizes that VK supplies. Each image URL appears once. |
repost.media[].variants[].url | string | Public image URL for this size. |
repost.media[].variants[].width | integer (optional) | Image width in pixels. |
repost.media[].variants[].height | integer (optional) | Image height in pixels. |
repost.media[].variants[].type | string (optional) | VK name for this image size. |
repost.repost | object (optional) | A copied post inside this copied post. Its fields are in the Second copied post table below. |
Example copied post row
This is a shortened example row from a successful run. Its values are copied from that run's dataset.
{"target": "https://vk.ru/id123456","targetType": "wallUrl","postId": "123456_5070","ownerId": 123456,"sourceUrl": "https://vk.com/wall123456_5070","text": "","isPinned": false,"author": {"id": 123456,"name": "Eduard Boldyshev","profileUrl": "https://vk.com/id123456","type": "profile","avatarUrl": "https://sun1-14.userapi.com/s/v1/ig1/KkufJivcgnjZAdEl8PenC_BLmGbY90uRNGx9KdNBZZ8A3-2Mcb1qscTtbN9xPpDrMu3CiYD5.jpg?quality=96&crop=0,0,428,428&blur=5,10&as=32x32,48x48,72x72,108x108,160x160,240x240,360x360&ava=1&u=MjukT764fBSZ3EZH4oyB4pSxxs2nndhV8ENdLW1HkuY&cs=100x100"},"engagement": {"likes": 0,"comments": 0,"reposts": 0,"views": 920},"media": [],"repost": {"postId": "-35647551_2559219","ownerId": -35647551,"sourceUrl": "https://vk.com/wall-35647551_2559219","text": "Иногда чей-то ежедневный труд однажды спасает десятки жизней.\n\nБольше 12 лет Сергей Сотников работал на закрытом аэродроме в небольшом селе Ижма. Хотя взлётно-посадочную полосу давно вывели из эксплуатации, он продолжал ухаживать за ней: убирал мусор, вырубал кустарник, обновлял разметку и не позволял превращать её в парковку или склад. Просто потому, что считал это правильным. \n\n7 сентября 2010 года этот, казалось бы, никому не нужный труд оказался бесценным. У пассажирского Ту-154, летевшего в Москву, в полёте отказали основные системы. Пилоты заметили заброшенную полосу в Ижме и смогли посадить самолёт. Все 72 пассажира и 9 членов экипажа остались живы. \n\nПозже многие говорили, что это было настоящее чудо. Но сам Сергей отвечал просто: он всего лишь добросовестно делал свою работу. Иногда именно такие люди незаметно меняют чужие судьбы.","postedAt": "2026-07-28T11:14:00.000Z","author": {"id": -35647551,"name": "TVC+","type": "community","profileUrl": "https://vk.com/tvcplus","avatarUrl": "https://sun1-26.userapi.com/s/v1/ig1/tSpnyn2CVcgttCdzTdTbRAvuEsDofheBFa43p6tfu7CRLd_KnFKAIxqdI_r5TJeYAfmP8Evx.jpg?quality=96&crop=0,0,1355,1355&as=32x32,48x48,72x72,108x108,160x160,240x240,360x360,480x480,540x540,640x640,720x720,1080x1080,1280x1280&ava=1&u=aZhJoLpUtVkwT-bfJ1er3rbmZoKyxf9O_Tw0PxU_geQ&cs=100x100","isVerified": true},"media": [{"type": "photo","id": 457389517,"ownerId": -35647551,"accessKey": "512988b12b51112bce","albumId": -7,"postedAt": "2026-07-27T14:14:11.000Z","url": "https://sun9-38.userapi.com/s/v1/ig2/jUuUA0gB0FK2EAT3EmehT5Z0o72Wch-Kj2psezpIOlqoMpqqKtv1MQLYLFIqRw_qb_NmEyN_yP9AAHVijPvukaNX.jpg?quality=95&as=32x32,48x48,72x72,108x108,160x160,240x240,360x360,480x480,540x540,640x640,720x720,1080x1080,1280x1280,1440x1440,2048x2048&from=bu&u=pT6XfJn-u962TRT8o0q26gZGDYF8gVpFerDngZMXsgg&cs=2048x0","thumbnailUrl": "https://sun9-38.userapi.com/s/v1/ig2/jUuUA0gB0FK2EAT3EmehT5Z0o72Wch-Kj2psezpIOlqoMpqqKtv1MQLYLFIqRw_qb_NmEyN_yP9AAHVijPvukaNX.jpg?quality=95&as=32x32,48x48,72x72,108x108,160x160,240x240,360x360,480x480,540x540,640x640,720x720,1080x1080,1280x1280,1440x1440,2048x2048&from=bu&u=pT6XfJn-u962TRT8o0q26gZGDYF8gVpFerDngZMXsgg&cs=2048x0","width": 2048,"height": 2048,"variants": "..."},"..."]},"postedAt": "2026-07-30T13:09:18.000Z"}
This example is shortened. The copied post has 7 photos, and only the first is shown. Image sizes and the other photos are replaced with "...".
Second copied post (repost.repost)
A second copied post is the deepest level. It has no copied post inside it, and its attachments keep only the fields listed below.
| Field | Type | What it does |
|---|---|---|
repost.repost.postId | string | Stable owner-and-post ID for the second copied post. |
repost.repost.ownerId | integer | VK ID of the wall with the second copied post. |
repost.repost.sourceUrl | string | Public VK URL for the second copied post. |
repost.repost.text | string | Text of the second copied post as plain text. |
repost.repost.postedAt | string (date and time, optional) | Publication date and time of the second copied post. |
repost.repost.author | object | Public author details for the second copied post. |
repost.repost.author.id | integer | Author's VK profile or community ID. |
repost.repost.author.name | string | Author's public name. |
repost.repost.author.type | string (optional) | profile or community, when VK provides it. |
repost.repost.author.profileUrl | string | Public URL of the author. |
repost.repost.author.avatarUrl | string (optional) | Public image URL of the author. |
repost.repost.author.isVerified | boolean (optional) | Whether VK marks the author as verified. |
repost.repost.media | array of objects | Attachments in the second copied post, in source order. |
repost.repost.media[].type | string | Source attachment type. |
repost.repost.media[].id | integer (optional) | VK attachment ID. |
repost.repost.media[].ownerId | integer (optional) | VK ID of the attachment owner. |
repost.repost.media[].accessKey | string (optional) | VK key used to open the attachment. |
repost.repost.media[].albumId | integer (optional) | VK photo album ID. |
repost.repost.media[].url | string (optional) | Public source or destination URL. |
repost.repost.media[].postedAt | string (date and time, optional) | Attachment publication date and time. |
repost.repost.media[].width | integer (optional) | Main image width in pixels. |
repost.repost.media[].height | integer (optional) | Main image height in pixels. |
repost.repost.media[].thumbnailUrl | string (optional) | Public preview image URL. |
repost.repost.media[].variants | array of objects (optional) | Image sizes that VK supplies. Each image URL appears once. |
repost.repost.media[].variants[].url | string | Public image URL for this size. |
repost.repost.media[].variants[].width | integer (optional) | Image width in pixels. |
repost.repost.media[].variants[].height | integer (optional) | Image height in pixels. |
repost.repost.media[].variants[].type | string (optional) | VK name for this image size. |
💳 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. Posts with no visible text, attachment, or copied post, and posts from a different page than the one you submitted, are not saved.
🔌 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 time the post is found, it 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. A repeat run also skips posts that earlier runs already returned.
Are date filters inclusive?
Yes. Use real YYYY-MM-DD dates. publishedAfter includes posts from the start of that UTC date and later. publishedBefore includes posts through the end of that UTC date and earlier. For example, 2026-09-17 includes posts through 2026-09-17T23:59:59.999Z. The dates apply to the wall post itself, not to a copied post inside it. The Actor checks older wall pages as needed. DD.MM.YYYY is not supported.
What if a submitted value is private or returns no posts?
No row is saved for private, login-only, deleted, hidden, unsupported, inaccessible, or no-result submitted values. For unreadable pages, the run log records the reason. The Actor is for public VK content and does not require a VK login.
What happens if one submitted value cannot be reached?
Rows already saved stay in the dataset. If other submitted values remain, the Actor checks them. If the failed value is the only or last one, there are no later values to check. If none of the submitted values returns any post, the run is marked as failed, not as a successful run with no results.
Does the Actor download media files?
No. It returns public links and details for supported photos, videos, and external links. Other attachment types keep their source type when the Actor cannot fill in their details.
What does repost contain?
When VK shows a copied post, repost includes its ID, link, text, author, publication time, and media. If that copied post also copied another post, the deeper copy appears in repost.repost. No further copies are included.
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 several public handles, URLs, or IDs in targets. The Actor saves each matching 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 value. Leave a limit empty to return all available matching posts until the relevant source is exhausted, subject to the other limit.
Can I skip pinned posts or reposts?
Yes. Turn off includePinnedPosts to skip pinned posts, which VK shows at the top of a page. Turn off includeReposts to skip posts a page shares from another post. Both switches are on by default. Pinned posts still follow the word and date filters.
Why was a pinned post or repost from another page not saved?
Each saved row was published on the page you submitted. A pinned post or repost by a different page is skipped, so it does not appear in your dataset.
Are reaction types numbers?
No. engagement.reactions[].type uses VK's reaction names, such as Like, Haha, Wow!, Love, or Sad. The counts for all types add up to the post's likes.
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
v3.0 (19-10-2026)
- Removed the
commentsPerPostinput and thepostTypeoutput field. Up to 100 top-level comments are saved for each post. - Reaction
typenow shows a readable name, such as Like, Haha, Wow!, Love, or Sad, instead of a number. The counts still add up to the post likes. - Post text is plain text, and links show as ordinary web addresses instead of VK link markup.
- Each image URL in a media item's image variants now appears once.
- Posts with no text, no media, and no copied post are no longer saved or charged.
- Posts published on another VK page, such as a pinned post or a repost from another page, are no longer saved under a target.
- Choose whether to save pinned posts with Include pinned posts.
- Choose whether to save reposts with Include reposted posts.
v2.0 (18-10-2026)
- Repost data covers the copied post and one more copied post inside it. Posts copied further down the chain are not saved.
- Media in the copied post inside a repost does not include the
title,caption,description,text,duration, orplayerUrlfields. - Engagement counts that VK does not show are left out instead of set to 0.
- Posts without a publish date are no longer saved.
- Later runs skip posts that earlier runs of this version already saved, even when a different input finds them. Those posts are not saved or charged again. Posts saved by older versions are not skipped.
- A run with profile, community, or post link targets fails when none of them returns any post and the run saves no posts. Keyword-only runs with no posts finish without failing.
- Unexpected failures during collection end the run with a short message that asks you to report the issue, instead of the raw error text.
- Each saved post includes
isPinnedastrueorfalse. - Filter posts by a word or phrase, so only matching posts are saved. Only each post's own text is checked, not the text of a post it reposts.
- Save the top-level comments for each post in a new
commentsfield. - Set how many top-level comments to save for each post with Comments per post. The default is 100, and 0 removes the count limit.
- If a post's comments are too large to fit in one saved row, or VK does not return them all, some are left out and the run logs a warning.
- Bare VK links, such as
vk.com/durovwithouthttps://, are now read as VK links instead of being treated as keyword targets. - A keyword target's warning now says later targets will still be checked, if there are any.
- A post link that VK does not return now logs a warning that the post may be deleted or private.
v1.0 (10-09-2026)
- Startup logs no longer show system details before the first public message.
- Dataset rows omit collection timestamps and unknown author types when VK does not provide them.
v0.0
- Initial release.
- 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.
🆘 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 Posts Scraper: 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 to compare with VK posts.
- Reddit Scraper: Collect public Reddit posts and comments for topic research with VK posts.
- Threads Search Post Scraper: Search public Threads posts by keyword to compare with VK posts on the same topic.
Made with ❤️ by Maxime Dupré