VK Posts Scraper avatar

VK Posts Scraper

Pricing

$3.60 / 1,000 posts

Go to Apify Store
VK Posts Scraper

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é

Maxime Dupré

Maintained by Community

Actor stats

0

Bookmarked

443

Total users

116

Monthly active users

4.7 days

Issues response

7 days ago

Last modified

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.

📦 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

  • target and targetType identify the submitted value that first found the post.
  • postId, ownerId, and sourceUrl provide stable identity and the public post link.
  • text, postedAt, and isPinned describe the post. editedAt appears when VK provides it.
  • author holds public author ID, name, type, profile link, avatar, and verification status when available.
  • engagement holds likes, comments, reposts, views, and reaction counts from VK. Reaction counts use VK's reaction names, such as Like or Haha.
  • media keeps one entry per source attachment with its type and available links or details.
  • repost holds the post this post copied, plus one more copied post inside it when VK provides it.
  • comments holds 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

  1. Add public VK handles, profile or community URLs, wall URLs, direct post URLs, owner IDs, or community IDs.
  2. Set maxItems for the whole run, and set maxItemsPerTarget when 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.
  3. Add publishedAfter and publishedBefore as YYYY-MM-DD dates to keep wall posts in an inclusive UTC date range.
  4. Turn off includePinnedPosts or includeReposts if you want to skip pinned posts or reposts.
  5. 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

FieldTypeWhat it does
targetsarray of stringsRequired list of public VK handles, profile or community URLs, wall URLs, direct post URLs, owner IDs, or community IDs.
maxItemsintegerSets 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.
maxItemsPerTargetintegerSets 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.
publishedAfterstringUse 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.
publishedBeforestringUse 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.
containsTextstringKeeps 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.
includePinnedPostsbooleanKeep 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.
includeRepostsbooleanKeep 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.

FieldTypeWhat it does
resultsstringOpens 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.

FieldTypeWhat it does
targetstringSubmitted value that first found the post.
targetTypestringKind of submitted value, such as handle, wallUrl, postUrl, or ownerId.
postIdstringVK's stable owner-and-post ID. Use it to match the same post across exports.
ownerIdintegerVK ID of the profile or community wall.
sourceUrlstringPublic VK URL for the post.
textstringPost text as plain text, with links shown as ordinary web addresses. It is empty for a media-only post.
postedAtstring (date and time)Publication date and time from VK.
editedAtstring (date and time, optional)Date and time when VK last edited the post.
isPinnedbooleantrue when VK marks the post as pinned. false when it does not.
authorobjectPublic details of the profile or community that wrote the post.
author.idintegerVK profile or community ID.
author.namestringPublic profile or community name. If VK gives no name, this shows an ID form such as id123 or club123.
author.typestring (optional)profile or community, when VK provides it.
author.profileUrlstringPublic VK profile or community URL.
author.avatarUrlstring (optional)Public author image URL.
author.isVerifiedboolean (optional)Whether VK marks the author as verified.
engagementobject (optional)Public counts from VK, when VK shows them.
engagement.likesinteger (optional)Number of likes, when VK shows it.
engagement.commentsinteger (optional)Number of comments on the post, when VK shows it.
engagement.repostsinteger (optional)Number of reposts, when VK shows it.
engagement.viewsinteger (optional)Number of views, when VK shows it.
engagement.reactionsarray of objects (optional)Counts by reaction type, when VK shows them.
engagement.reactions[].typestringVK'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[].countintegerNumber of reactions of this type.
mediaarray of objectsOne entry for each source attachment, in source order.
media[].typestringSource attachment type, such as photo, video, or link. It stays present for unsupported attachment types.
media[].idinteger (optional)VK attachment ID.
media[].ownerIdinteger (optional)VK ID of the attachment owner.
media[].accessKeystring (optional)VK key used to open the attachment.
media[].albumIdinteger (optional)VK photo album ID.
media[].urlstring (optional)Public source or destination URL.
media[].playerUrlstring (optional)Public video player URL.
media[].titlestring (optional)Attachment title.
media[].captionstring (optional)Attachment caption.
media[].textstring (optional)Attachment text.
media[].descriptionstring (optional)Attachment description.
media[].postedAtstring (date and time, optional)Attachment publication date and time.
media[].durationinteger (optional)Video length in seconds.
media[].widthinteger (optional)Main image width in pixels.
media[].heightinteger (optional)Main image height in pixels.
media[].thumbnailUrlstring (optional)Public preview image URL.
media[].variantsarray of objects (optional)Image sizes that VK supplies. Each image URL appears once.
media[].variants[].urlstringPublic image URL for this size.
media[].variants[].widthinteger (optional)Image width in pixels.
media[].variants[].heightinteger (optional)Image height in pixels.
media[].variants[].typestring (optional)VK name for this image size.
repostobject (optional)The post this post copied. Its fields are in the Copied post table below.
commentsarray of objects (optional)Public top-level comments saved for this post, up to 100. Replies are not included.
comments[].authorobjectPublic details of the profile or community that wrote the comment.
comments[].author.idintegerCommenter's VK profile or community ID.
comments[].author.namestringCommenter's public name. If VK gives no name, this shows an ID form such as id123 or club123.
comments[].author.typestring (optional)profile or community, when VK provides it.
comments[].author.profileUrlstringPublic commenter profile or community URL.
comments[].author.avatarUrlstring (optional)Public commenter image URL.
comments[].author.isVerifiedboolean (optional)Whether VK marks the commenter as verified.
comments[].textstringVisible comment text. It can be empty.
comments[].postedAtstring (date and time)Comment publication date and time from VK.
comments[].likesintegerNumber 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.

FieldTypeWhat it does
repost.postIdstringStable owner-and-post ID for the copied post.
repost.ownerIdintegerVK ID of the wall with the copied post.
repost.sourceUrlstringPublic VK URL for the copied post.
repost.textstringCopied post text as plain text, with links shown as ordinary web addresses.
repost.postedAtstring (date and time, optional)Publication date and time of the copied post.
repost.authorobjectPublic author details for the copied post.
repost.author.idintegerCopied post author's VK profile or community ID.
repost.author.namestringCopied post author's public name.
repost.author.typestring (optional)profile or community, when VK provides it.
repost.author.profileUrlstringPublic URL of the copied post author.
repost.author.avatarUrlstring (optional)Public image URL of the copied post author.
repost.author.isVerifiedboolean (optional)Whether VK marks the copied post author as verified.
repost.mediaarray of objectsAttachments in the copied post, in source order.
repost.media[].typestringSource attachment type, such as photo, video, or link. It stays present for unsupported attachment types.
repost.media[].idinteger (optional)VK attachment ID.
repost.media[].ownerIdinteger (optional)VK ID of the attachment owner.
repost.media[].accessKeystring (optional)VK key used to open the attachment.
repost.media[].albumIdinteger (optional)VK photo album ID.
repost.media[].urlstring (optional)Public source or destination URL.
repost.media[].playerUrlstring (optional)Public video player URL.
repost.media[].titlestring (optional)Attachment title.
repost.media[].captionstring (optional)Attachment caption.
repost.media[].textstring (optional)Attachment text.
repost.media[].descriptionstring (optional)Attachment description.
repost.media[].postedAtstring (date and time, optional)Attachment publication date and time.
repost.media[].durationinteger (optional)Video length in seconds.
repost.media[].widthinteger (optional)Main image width in pixels.
repost.media[].heightinteger (optional)Main image height in pixels.
repost.media[].thumbnailUrlstring (optional)Public preview image URL.
repost.media[].variantsarray of objects (optional)Image sizes that VK supplies. Each image URL appears once.
repost.media[].variants[].urlstringPublic image URL for this size.
repost.media[].variants[].widthinteger (optional)Image width in pixels.
repost.media[].variants[].heightinteger (optional)Image height in pixels.
repost.media[].variants[].typestring (optional)VK name for this image size.
repost.repostobject (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.

FieldTypeWhat it does
repost.repost.postIdstringStable owner-and-post ID for the second copied post.
repost.repost.ownerIdintegerVK ID of the wall with the second copied post.
repost.repost.sourceUrlstringPublic VK URL for the second copied post.
repost.repost.textstringText of the second copied post as plain text.
repost.repost.postedAtstring (date and time, optional)Publication date and time of the second copied post.
repost.repost.authorobjectPublic author details for the second copied post.
repost.repost.author.idintegerAuthor's VK profile or community ID.
repost.repost.author.namestringAuthor's public name.
repost.repost.author.typestring (optional)profile or community, when VK provides it.
repost.repost.author.profileUrlstringPublic URL of the author.
repost.repost.author.avatarUrlstring (optional)Public image URL of the author.
repost.repost.author.isVerifiedboolean (optional)Whether VK marks the author as verified.
repost.repost.mediaarray of objectsAttachments in the second copied post, in source order.
repost.repost.media[].typestringSource attachment type.
repost.repost.media[].idinteger (optional)VK attachment ID.
repost.repost.media[].ownerIdinteger (optional)VK ID of the attachment owner.
repost.repost.media[].accessKeystring (optional)VK key used to open the attachment.
repost.repost.media[].albumIdinteger (optional)VK photo album ID.
repost.repost.media[].urlstring (optional)Public source or destination URL.
repost.repost.media[].postedAtstring (date and time, optional)Attachment publication date and time.
repost.repost.media[].widthinteger (optional)Main image width in pixels.
repost.repost.media[].heightinteger (optional)Main image height in pixels.
repost.repost.media[].thumbnailUrlstring (optional)Public preview image URL.
repost.repost.media[].variantsarray of objects (optional)Image sizes that VK supplies. Each image URL appears once.
repost.repost.media[].variants[].urlstringPublic image URL for this size.
repost.repost.media[].variants[].widthinteger (optional)Image width in pixels.
repost.repost.media[].variants[].heightinteger (optional)Image height in pixels.
repost.repost.media[].variants[].typestring (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 commentsPerPost input and the postType output field. Up to 100 top-level comments are saved for each post.
  • Reaction type now 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, or playerUrl fields.
  • 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 isPinned as true or false.
  • 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 comments field.
  • 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/durov without https://, 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 targetType and scrapedAt.
  • 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, and engagement.total remain unsupported.

🆘 Support

For issues, questions, or feature requests, file a ticket and I'll fix or implement it in less than 24h 🫡

Made with ❤️ by Maxime Dupré