# VK Scraper — Profiles, Walls, Posts & Comments (`scrapingmonkey/vk-public-data-scraper`) Actor

Scrape public VK profiles, communities, walls, posts, comments, replies, engagement, reposts, and attachment metadata from known handles or URLs—without a VK token or login.

- **URL**: https://apify.com/scrapingmonkey/vk-public-data-scraper.md
- **Developed by:** [ScrapingMonkey](https://apify.com/scrapingmonkey) (community)
- **Categories:** Automation, News, Social media
- **Stats:** 4 total users, 1 monthly users, 88.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 owner results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## VK Scraper - Profiles, Communities, Posts, Comments and Monitoring

Collect public VK profiles, communities, wall posts, post details, comments, audience counters, attachments, and visible media summaries in one structured dataset.

- Extract public user and community identity, descriptions, status, verification, profile images, and visible counters
- Paginate public walls and preserve post text, dates, authors, views, likes, comments, reposts, and reactions
- Retrieve individual wall posts and public top-level comments by URL or `wallOWNER_POST` identifier
- Preserve available attachments and enrich profiles with visible subscriptions, follower samples, covers, and media summaries
- Monitor public walls and save only new or changed posts on scheduled runs
- Process multiple screen names, profile URLs, community URLs, owner IDs, and post URLs in one run
- No VK account, access token, cookies, browser, or user-supplied proxy is required; requests use the built-in Apify Residential Proxy
- Export results to JSON, CSV, Excel, XML, RSS, or access them through the Apify API

### What can you do with this Actor?

| Mode / action | Input | Output | Best for |
| --- | --- | --- | --- |
| `walls` | Public user or community screen names and URLs | Paginated public `post` rows | Content research, publishing analysis, and monitoring |
| `owners` | Public screen names, profile URLs, community URLs, or owner IDs | Normalized `owner` rows | Profile and community intelligence |
| `posts` | Public wall post URLs or `wallOWNER_POST` identifiers | Complete public `post` rows | Post-level content, media, and engagement analysis |
| `comments` | Public wall post URLs or identifiers | Public top-level `comment` rows | Audience feedback and discussion research |
| `profileMedia` | Public user or community targets | `owner` rows enriched with visible media summaries | Public content inventory and profile auditing |
| `auto` | Mixed public profile, community, and wall-post URLs in `startUrls` | `owner` or `post` rows selected from each URL | Batch processing mixed known targets |
| `monitor` | Public owner targets plus a stable `monitorKey` | Only new or new-and-changed `post` rows | Scheduled wall monitoring |

Choose one mode per run. Multiple public targets can be processed together; `walls` can optionally add public top-level comments to the same Results dataset.

### Quick start

1. Open the Actor and click **Try for free**.
2. Keep **Walls** selected or choose another workflow.
3. Enter public screen names, profile/community URLs, owner IDs, or wall-post URLs and set the result limit.
4. Click **Start**.
5. Preview the single **Results** table or download it in your preferred format.

The default input collects recent public wall posts from `durov` and is ready to run.

### Input examples

#### Public wall

```json
{
  "mode": "walls",
  "targets": [
    "durov"
  ],
  "maxItems": 100,
  "includeComments": false,
  "country": "US"
}
```

#### Owner details

```json
{
  "mode": "owners",
  "targets": [
    "durov",
    "team"
  ],
  "country": "US"
}
```

#### Post details

```json
{
  "mode": "posts",
  "targets": [
    "https://vk.ru/wall1_456"
  ],
  "country": "US"
}
```

#### Public comments

```json
{
  "mode": "comments",
  "targets": [
    "wall1_456"
  ],
  "maxCommentsPerPost": 100,
  "country": "US"
}
```

#### Monitor new wall posts

```json
{
  "mode": "monitor",
  "targets": [
    "durov"
  ],
  "maxItems": 100,
  "monitorKey": "durov-daily",
  "country": "US"
}
```

#### Profile media summary

```json
{
  "mode": "profileMedia",
  "targets": [
    "durov"
  ],
  "country": "US"
}
```

#### Auto-detect mixed public URLs

```json
{
  "mode": "auto",
  "startUrls": [
    "https://vk.ru/durov",
    "https://vk.ru/wall1_456"
  ],
  "country": "US"
}
```

`maxItems` limits retained rows per target. `maxCommentsPerPost` applies separately to each post when comment extraction is enabled.

### Complete output examples

Every result row contains exactly 66 top-level fields. The same complete key set makes mixed result types predictable in JSON exports and keeps every field visible in the single Results view.

#### Complete `owner` row — 66 top-level fields

```json
{
  "recordType": "owner",
  "sourceMode": "owners",
  "sourceTarget": "example-target",
  "sourceUrl": "https://example.com/public-result",
  "sourceEndpoints": [],
  "ownerId": "123456",
  "ownerType": null,
  "screenName": null,
  "firstName": null,
  "lastName": null,
  "name": "Example public record",
  "description": "Example public content",
  "status": "Example public content",
  "profileUrl": "https://example.com/public-result",
  "birthDate": null,
  "city": {},
  "country": {},
  "sex": 0,
  "verified": false,
  "isClosed": false,
  "online": false,
  "followersCount": 0,
  "followingCount": 0,
  "friendsCount": 0,
  "photosCount": 0,
  "videosCount": 0,
  "clipsCount": 0,
  "articlesCount": 0,
  "giftsCount": 0,
  "site": "https://example.com/public-result",
  "occupation": {},
  "counters": {},
  "profilePhotoUrl": "https://cdn.example.com/image.jpg",
  "cover": {},
  "subscriptions": {},
  "followerSample": [],
  "mediaOverview": {},
  "postId": "example-id",
  "canonicalUrl": "https://example.com/public-result",
  "text": "Example public content",
  "textHtml": "Example public content",
  "publishedAt": "2026-08-13T12:00:00Z",
  "editedAt": "2026-08-13T12:00:00Z",
  "authorId": "123456",
  "authorName": "Example public record",
  "authorUrl": "https://example.com/public-result",
  "postType": null,
  "viewsCount": 0,
  "likesCount": 0,
  "commentsCount": 0,
  "repostsCount": 0,
  "reactions": {},
  "attachments": [],
  "copyHistory": [],
  "commentId": "123456",
  "parentCommentId": "123456",
  "replyToUser": "123456",
  "dateLabel": null,
  "attributes": {},
  "temporaryMediaUrlsIncluded": false,
  "isPartial": false,
  "monitorStatus": null,
  "changedFields": [],
  "previousCapturedAt": "2026-08-13T12:00:00Z",
  "capturedAt": "2026-08-13T12:00:00Z",
  "raw": {}
}
```

#### Complete `post` row — 66 top-level fields

```json
{
  "recordType": "post",
  "sourceMode": "walls",
  "sourceTarget": "example-target",
  "sourceUrl": "https://example.com/public-result",
  "sourceEndpoints": [],
  "ownerId": "123456",
  "ownerType": null,
  "screenName": null,
  "firstName": null,
  "lastName": null,
  "name": "Example public record",
  "description": "Example public content",
  "status": "Example public content",
  "profileUrl": "https://example.com/public-result",
  "birthDate": null,
  "city": {},
  "country": {},
  "sex": 0,
  "verified": false,
  "isClosed": false,
  "online": false,
  "followersCount": 0,
  "followingCount": 0,
  "friendsCount": 0,
  "photosCount": 0,
  "videosCount": 0,
  "clipsCount": 0,
  "articlesCount": 0,
  "giftsCount": 0,
  "site": "https://example.com/public-result",
  "occupation": {},
  "counters": {},
  "profilePhotoUrl": "https://cdn.example.com/image.jpg",
  "cover": {},
  "subscriptions": {},
  "followerSample": [],
  "mediaOverview": {},
  "postId": "example-id",
  "canonicalUrl": "https://example.com/public-result",
  "text": "Example public content",
  "textHtml": "Example public content",
  "publishedAt": "2026-08-13T12:00:00Z",
  "editedAt": "2026-08-13T12:00:00Z",
  "authorId": "123456",
  "authorName": "Example public record",
  "authorUrl": "https://example.com/public-result",
  "postType": null,
  "viewsCount": 0,
  "likesCount": 0,
  "commentsCount": 0,
  "repostsCount": 0,
  "reactions": {},
  "attachments": [],
  "copyHistory": [],
  "commentId": "123456",
  "parentCommentId": "123456",
  "replyToUser": "123456",
  "dateLabel": null,
  "attributes": {},
  "temporaryMediaUrlsIncluded": false,
  "isPartial": false,
  "monitorStatus": null,
  "changedFields": [],
  "previousCapturedAt": "2026-08-13T12:00:00Z",
  "capturedAt": "2026-08-13T12:00:00Z",
  "raw": {}
}
```

#### Complete `comment` row — 66 top-level fields

```json
{
  "recordType": "comment",
  "sourceMode": "comments",
  "sourceTarget": "example-target",
  "sourceUrl": "https://example.com/public-result",
  "sourceEndpoints": [],
  "ownerId": "123456",
  "ownerType": null,
  "screenName": null,
  "firstName": null,
  "lastName": null,
  "name": "Example public record",
  "description": "Example public content",
  "status": "Example public content",
  "profileUrl": "https://example.com/public-result",
  "birthDate": null,
  "city": {},
  "country": {},
  "sex": 0,
  "verified": false,
  "isClosed": false,
  "online": false,
  "followersCount": 0,
  "followingCount": 0,
  "friendsCount": 0,
  "photosCount": 0,
  "videosCount": 0,
  "clipsCount": 0,
  "articlesCount": 0,
  "giftsCount": 0,
  "site": "https://example.com/public-result",
  "occupation": {},
  "counters": {},
  "profilePhotoUrl": "https://cdn.example.com/image.jpg",
  "cover": {},
  "subscriptions": {},
  "followerSample": [],
  "mediaOverview": {},
  "postId": "example-id",
  "canonicalUrl": "https://example.com/public-result",
  "text": "Example public content",
  "textHtml": "Example public content",
  "publishedAt": "2026-08-13T12:00:00Z",
  "editedAt": "2026-08-13T12:00:00Z",
  "authorId": "123456",
  "authorName": "Example public record",
  "authorUrl": "https://example.com/public-result",
  "postType": null,
  "viewsCount": 0,
  "likesCount": 0,
  "commentsCount": 0,
  "repostsCount": 0,
  "reactions": {},
  "attachments": [],
  "copyHistory": [],
  "commentId": "123456",
  "parentCommentId": "123456",
  "replyToUser": "123456",
  "dateLabel": null,
  "attributes": {},
  "temporaryMediaUrlsIncluded": false,
  "isPartial": false,
  "monitorStatus": null,
  "changedFields": [],
  "previousCapturedAt": "2026-08-13T12:00:00Z",
  "capturedAt": "2026-08-13T12:00:00Z",
  "raw": {}
}
```

### What data can you extract?

| Category | Fields |
| --- | --- |
| Source and capture | `recordType`, `sourceMode`, `sourceTarget`, `sourceUrl`, `sourceEndpoints`, `capturedAt` |
| Owner identity | `ownerId`, `ownerType`, `screenName`, `firstName`, `lastName`, `name`, `profileUrl` |
| Public profile data | `description`, `status`, `birthDate`, `city`, `country`, `sex`, `verified`, `isClosed`, `online`, `site`, `occupation` |
| Audience and content counts | `followersCount`, `followingCount`, `friendsCount`, `photosCount`, `videosCount`, `clipsCount`, `articlesCount`, `giftsCount`, `counters` |
| Profile media and relationships | `profilePhotoUrl`, `cover`, `subscriptions`, `followerSample`, `mediaOverview` |
| Posts and engagement | `postId`, `canonicalUrl`, `text`, `textHtml`, `publishedAt`, `editedAt`, `authorId`, `authorName`, `authorUrl`, `postType`, `viewsCount`, `likesCount`, `commentsCount`, `repostsCount`, `reactions`, `attachments`, `copyHistory` |
| Comments | `commentId`, `parentCommentId`, `replyToUser`, `dateLabel`, `attributes` |
| Monitoring and diagnostics | `temporaryMediaUrlsIncluded`, `isPartial`, `monitorStatus`, `changedFields`, `previousCapturedAt`, `raw` |

Nested fields such as `city`, `country`, `occupation`, `counters`, `cover`, `subscriptions`, `followerSample`, `mediaOverview`, `reactions`, `attachments`, `copyHistory`, `attributes`, and optional `raw` retain VK's public source structure. Their nested keys are source-controlled and can change; the 66 top-level keys above are fixed by the Actor.

### Input parameters

| Parameter | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `mode` | `string` | No | `"walls"` | `auto`, `owners`, `walls`, `posts`, `comments`, `profileMedia`, or `monitor`. |
| `targets` | `string[]` | In all target modes | `["durov"]` | Public screen names, profile/community URLs, wall-post URLs, or `wallOWNER_POST` identifiers. |
| `startUrls` | `string[]` | In `auto` | `[]` | Mixed public profile, community, or wall-post URLs. |
| `maxItems` | `integer` | No | `100` | Maximum retained rows per target, from 1 to 10,000. |
| `maxPages` | `integer` | No | `20` | Maximum public wall pages per owner, from 1 to 500. |
| `maxCommentsPerPost` | `integer` | No | `100` | Maximum top-level comments per post, from 0 to 10,000; 0 skips them. |
| `includeComments` | `boolean` | No | `false` | Fetch public top-level comments for wall posts with extra requests. |
| `includeAttachments` | `boolean` | No | `true` | Preserve public attachment objects on post rows. |
| `includeTemporaryMediaUrls` | `boolean` | No | `true` | Preserve observed public media URLs even when their CDN lifetime may be limited. |
| `publishedAfter` | `string` | No | `""` | Optional ISO date/timestamp lower bound applied after extraction. |
| `publishedBefore` | `string` | No | `""` | Optional ISO date/timestamp upper bound applied after extraction. |
| `maxConcurrency` | `integer` | No | `3` | Concurrent public targets, from 1 to 10. |
| `requestTimeoutSecs` | `integer` | No | `60` | Per-request timeout in seconds, from 15 to 120. |
| `country` | `string` | No | `"US"` | Two-letter ISO country used for the internal residential proxy region. |
| `includeRaw` | `boolean` | No | `false` | Include the redacted public source object; increases dataset size. |
| `monitorMode` | `string` | No | `"off"` | `off`, `onlyNew`, or `newAndChanged`. |
| `monitorKey` | `string` | With monitoring | `"default"` | Stable comparison-state namespace for recurring runs. |
| `maxSessionRotations` | `integer` | No | `3` | Fresh residential sessions tried after blocks, from 1 to 6. |

### Pay-per-event result types

| Event | Charged when |
| --- | --- |
| `owner-result` | One `owner` row is accepted by the Dataset. |
| `post-result` | One `post` row is accepted by the Dataset. |
| `comment-result` | One `comment` row is accepted by the Dataset. |

The Actor does not emit a paid error event. Failed targets are counted by category in `RUN_SUMMARY`; successful targets continue. Actual event prices are shown on the Actor's Pricing tab.

### Use cases

#### Profile and community intelligence

Collect public identity, descriptions, audience counters, profile imagery, visible subscriptions, follower samples, and media summaries.

#### Content and engagement analysis

Export wall posts with text, timestamps, authors, reactions, views, likes, comments, reposts, attachments, and repost chains.

#### Public comment research

Collect top-level public comments for feedback analysis, community research, and moderation dashboards outside VK.

#### Monitoring and data pipelines

Schedule recurring runs and send new rows through webhooks to Google Sheets, Airtable, Make, Zapier, n8n, Airbyte, or a data warehouse.

### Performance and cost

Direct HTTP generally uses substantially less memory and bandwidth than launching a browser, but source response size, retries, optional enrichment, raw objects, and pagination determine actual cost. Start with a small limit, inspect the Dataset and RUN\_SUMMARY, then scale. Lower concurrency is usually more reliable on stricter public sites.

### API usage

Replace `YOUR_USERNAME` with the publishing Apify username after publication:

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/YOUR_USERNAME~vk-public-scraper/runs?token=APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "mode": "walls",
    "targets": ["durov"],
    "maxItems": 100,
    "country": "US"
  }'
```

The request body is the same JSON used in Apify Console. Read results from the run's default Dataset or use the output link that opens `view=overview`.

### Best for / not for

**Best for:** public profile and community details, known wall targets, post enrichment, public top-level comments, media summaries, and scheduled monitoring.

**Not for:** keyword search, private or login-only content, complete nested reply trees, authenticated API methods, account actions, or permanent media hosting.

### Limits and good to know

VK keyword search, private profiles and communities, nested reply expansion, login-only content, and authenticated API methods are intentionally excluded. Public page payloads and endpoints can differ by owner type and region.

A missing public value is returned as `null` or an empty array. One failed input does not create a frightening error row in Results. If every input fails, the run fails after writing diagnostic counts to RUN\_SUMMARY.

### Frequently asked questions

#### What input should I provide?

Use a public screen name, profile/community URL, numeric owner ID, full wall-post URL, or `wallOWNER_POST` identifier that matches the selected mode.

#### How many results can I extract?

`maxItems` accepts 1-10,000 per target, `maxPages` accepts 1-500, and `maxCommentsPerPost` accepts 0-10,000 per post. Public availability and VK pagination can return fewer rows.

#### Can I process multiple inputs?

Yes. Add multiple public targets or URLs; target failures are isolated and successful targets continue.

#### Can I schedule recurring runs?

Yes. Use Apify schedules with `mode: "monitor"`, a stable `monitorKey`, and webhooks for downstream notifications.

#### Does this Actor open a browser?

No. Runtime extraction uses direct HTTP only and contains no Playwright, Selenium, Chromium, or browser installation.

#### Do I need an account or cookies?

No. The supported modes use public pages and anonymous endpoints. Cookies or authorization values from research captures are never embedded in the release.

#### Do I need to configure a proxy?

No. On Apify, the Actor creates a Residential Proxy configuration internally and does not expose proxy settings in Input. Local developers may privately point the documented test-only environment variable at a proxy file; that variable is not an Actor input and is ignored on the platform.

#### Why are some fields empty?

The single Results view covers every result type. Fields that do not apply to a row remain empty, while the complete key set is preserved in JSON.

### Responsible use

Collect only public VK data you are permitted to process. Respect applicable law, privacy rights, platform terms, rate limits, and intellectual-property rights. This Actor is not affiliated with or endorsed by VK.

### Support

For a reproducible issue, include the Apify run ID, mode, a non-sensitive public target, expected result, and actual result. Never send account credentials, cookies, access tokens, proxy passwords, or private content.

### Local development

For local read-only smoke tests only, `VK_TEST_PROXY_FILE` may point to a private file containing one `login:password@host:port` proxy per line. The file is never read on Apify and must not be committed.

# Actor input Schema

## `mode` (type: `string`):

Choose owner details, walls, individual posts, comments, profile media summaries, auto detection, or monitoring.

## `targets` (type: `array`):

Public screen names, profile/community URLs, wall post URLs, or wall owner\_post IDs accepted by the selected mode.

## `startUrls` (type: `array`):

Public profile, community, or wall post URLs.

## `maxItems` (type: `integer`):

Maximum post, comment, or owner records retained per target.

## `maxPages` (type: `integer`):

Maximum public wall pages requested per owner.

## `maxCommentsPerPost` (type: `integer`):

Maximum public top-level comments retained for each post. Use 0 to skip comment extraction.

## `includeComments` (type: `boolean`):

Request public top-level comments for wall posts using extra HTTP requests.

## `includeAttachments` (type: `boolean`):

Keep public attachment objects on post rows.

## `includeTemporaryMediaUrls` (type: `boolean`):

Keep public media URLs returned by VK even when their CDN lifetime may be limited.

## `publishedAfter` (type: `string`):

Optional ISO date or timestamp lower bound applied after extraction.

## `publishedBefore` (type: `string`):

Optional ISO date or timestamp upper bound applied after extraction.

## `maxConcurrency` (type: `integer`):

Maximum public VK targets processed at once.

## `requestTimeoutSecs` (type: `integer`):

Maximum time in seconds for one public HTTP request.

## `country` (type: `string`):

Two-letter ISO country used as the public request region.

## `includeRaw` (type: `boolean`):

Add the complete public source object after cookie, authorization, token, and signature fields are redacted. Increases dataset size.

## `monitorMode` (type: `string`):

Optionally save only new records or new and changed records between named runs.

## `monitorKey` (type: `string`):

Stable namespace for comparison state. Use a different key for independent monitors.

## `maxSessionRotations` (type: `integer`):

Maximum fresh residential proxy sessions tried after blocks, limits, or challenges.

## Actor input object example

```json
{
  "mode": "walls",
  "targets": [
    "durov"
  ],
  "startUrls": [],
  "maxItems": 100,
  "maxPages": 20,
  "maxCommentsPerPost": 100,
  "includeComments": false,
  "includeAttachments": true,
  "includeTemporaryMediaUrls": true,
  "publishedAfter": "",
  "publishedBefore": "",
  "maxConcurrency": 3,
  "requestTimeoutSecs": 60,
  "country": "US",
  "includeRaw": false,
  "monitorMode": "off",
  "monitorKey": "default",
  "maxSessionRotations": 3
}
```

# Actor output Schema

## `dataset` (type: `string`):

All 66 fields in one complete Results table.

## `runSummary` (type: `string`):

Request, retry, failure, byte, result, and charged-event counts.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapingmonkey/vk-public-data-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("scrapingmonkey/vk-public-data-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call scrapingmonkey/vk-public-data-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapingmonkey/vk-public-data-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/JTLcRqc4gTgZD9Ot5/builds/HFSL46xopR7ZTyD7M/openapi.json
