# Pikabu Scraper - Stories, Comments, Communities, Search (`abotapi/pikabu-scraper`) Actor

Scrape Pikabu (Пикабу): keyword search, hot/new/best feeds, communities, tags, full story details with media, all comments, creator profiles. Monitoring (NEW, UPDATED, REAPPEARED, EXPIRED), incremental runs, resume, MCP export.

- **URL**: https://apify.com/abotapi/pikabu-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 result records

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Pikabu Scraper

Collect public Pikabu stories, comments and creator profiles. Search by keyword, walk feeds and community or tag listings, or supply individual story links. Story details include text, images, videos, tags, authors and vote counts where the source supplies them. Comments are separate records, so their parent IDs can be used to reconstruct threads.

### Why This Scraper?

- Search by keyword with relevance, rating or newest ordering.
- Combine feed links and individual stories in the same collection.
- Return full-size images and video sources, posters and dimensions.
- Collect comments with author information, votes and parent IDs.
- Read profile counters, registration dates, avatars and awards.
- Set shared item limits and individual comment limits.
- Resume story collection and suppress unchanged records in recurring runs.

### Data You Get

| Field | Example or meaning |
|---|---|
| `kind` | `story`, `comment` or `profile` |
| `id` | `00000001` |
| `url` | Story, comment permalink or profile URL |
| `title` | `Sample Story` |
| `text` | `Sample public text` |
| `author` | Public ID, nickname, profile URL and optional avatar/subscriber count |
| `community` | Community name, slug and URL when present |
| `tags` | `["Sample tag"]` |
| `tagUrls` | Tag page links |
| `rating` | `120` |
| `pluses` | `130` positive votes |
| `minuses` | `10` negative votes |
| `commentsCount` | `11` |
| `publishedAt` | `2026-01-01T00:00:00+03:00` |
| `blocks` | Ordered text, image and video content |
| `images` | Full-size story URLs; image objects on comments |
| `videos` | Sources, poster, duration, dimensions and video identifiers |
| `media` | Story image and video counts |
| `storyId` | Parent story ID on a comment |
| `parentId` | Parent comment ID; `0` represents a root comment |
| `depth` | Comment nesting depth |
| `registeredAt` | Profile registration date |
| `stats` | Exact profile rating, comment, story and subscriber counts |
| `awards` | Public profile awards with image and optional link |
| `changeType` | `NEW`, `UPDATED`, `UNCHANGED` or `EXPIRED` in incremental runs |

Other fields include comment links, edited and story-author appreciation flags, long-story and pinned flags, profile user ID, avatar, background image, following count and verified badge. Profile rows include recent story cards. Optional fields may be null or empty when absent from the source.

Community links collect the community's stories; they do not produce a separate community-header record. Feed and search cards can contain partial text or media. Enable `fetchDetails` for the full story page, and `fetchComments` to collect its available comments.

### How to Use

Choose a mode and set `maxItems`. This cap includes stories, comments and profile rows together. `0` means no item limit, so collection continues until the available results end.

#### Keyword search

Search uses its own query and ordering fields. An empty query searches the general result listing. Feed, story and profile link fields are ignored in this mode.

> Sample shape, values are illustrative placeholders.

```json
{
  "mode": "search",
  "searchQuery": "games",
  "searchOrder": "date",
  "fetchDetails": false,
  "fetchComments": false,
  "maxItems": 20
}
```

#### Mixed feed and story links

Feed and Story link fields appear in one input section. In either `feed` or `story` mode, either field accepts feeds, communities, tags, user blogs, individual story URLs and numeric story IDs. Individual stories are read first, then listings are walked; duplicate story IDs are skipped. When a Feed-mode request has no links, it uses the home feed.

> Sample shape, values are illustrative placeholders.

```json
{
  "mode": "feed",
  "feedLinks": ["https://pikabu.ru/new"],
  "storyUrls": ["https://pikabu.ru/story/sample_story_00000001"],
  "fetchDetails": false,
  "fetchComments": false,
  "maxItems": 20
}
```

#### Story detail and comments

Individual story links always open full detail. The story is returned before its comments, so a small item cap does not omit the parent story. `maxCommentsPerStory` limits returned comments for each story; the shared `maxItems` limit still applies.

> Sample shape, values are illustrative placeholders.

```json
{
  "mode": "story",
  "storyUrls": ["00000001"],
  "fetchComments": true,
  "maxCommentsPerStory": 11,
  "maxItems": 12
}
```

#### Creator profiles

Profile mode returns the header, then walks the creator's stories. Turn off details and comments when you need profile counters and story cards only.

> Sample shape, values are illustrative placeholders.

```json
{
  "mode": "profile",
  "profileUrls": ["https://pikabu.ru/@sample_creator"],
  "fetchDetails": false,
  "fetchComments": false,
  "maxItems": 5
}
```

#### Recurring collections and resume

Use `resumeFromRunId` to skip stories already present in a previous run or dataset. Use `incrementalMode` for recurring collections with the same scope. The initial run marks records `NEW`; later runs suppress unchanged records unless `emitUnchanged` is enabled. Comparisons cover title, text, rating, comment count and selected content-block values; profile counter changes alone are not detected. `changedFields` currently reports `record` for an update.

`stateKey` names a monitoring scope. `emitExpired` returns records absent from a completed scan. Leave it off when collecting a limited sample. Returned unchanged or expired rows are billed as result items; expired placeholders do not trigger detail or comment enrichment.

### Input Parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `mode` | select | `search` | Search, feed, story or profile collection. |
| `searchQuery` | string | empty | Keyword or phrase; the form offers a sample value. |
| `searchOrder` | select | `relevance` | `relevance`, `rating` or `date`. |
| `feedLinks` | string array | home feed in empty Feed mode | Listing URLs or story URLs/IDs; shared with Story links. |
| `storyUrls` | string array | empty | Story URLs/IDs or listing URLs in Feed and Story modes. |
| `profileUrls` | string array | empty | Profile URLs or account names in Profile mode. |
| `fetchDetails` | boolean | `true` | Open full story pages in search/listing collections; one enrichment event per returned detailed story. |
| `fetchComments` | boolean | `true` | Collect comments from opened stories; additional enrichment uses `round(returned comments / 10)` per story. |
| `maxCommentsPerStory` | integer | `0` | Returned comments per story; `0` means all available, subject to `maxItems`. |
| `maxItems` | integer | `20` | Shared cap across all returned record kinds; `0` means unlimited. |
| `proxyConfiguration` | object | enabled in form | Connection settings in the Console input. |
| `mcpConnectors` | connector array | empty | Optional app connections that receive record summaries. |
| `notionParentPageUrl` | string | empty | Parent page URL or ID for Notion exports. |
| `maxNotifyListings` | integer | `50` | Export limit per connector (1-1000); does not affect dataset size. |
| `resumeFromRunId` | string | empty | Previous run or dataset ID used to skip collected stories. |
| `incrementalMode` | boolean | `false` | Track supported record changes between matching runs. |
| `stateKey` | string | automatic | Optional monitoring-scope name. |
| `emitUnchanged` | boolean | `false` | Also return unchanged records. |
| `emitExpired` | boolean | `false` | Return missing records after a completed scan. |

#### Charges

Every returned record has a result-item charge. The `detail-enrichment` event is shared by story details and comment collection: one event per returned detailed story, plus **`round(returned comments / 10)` events per story**. These enrichment events are additional to result-item charges.

Rounding uses the nearest integer, with exact halves going to the nearest even integer: 5 comments add 0 events, 6 or 11 add 1, 15 add 2, and 25 add 2. Suppressed comments and failed writes do not count. Counts are based on actual returned comments, not the configured maximum.

On the Free subscription tier, a result item costs $0.003, an enrichment event costs $0.0008 and actor start costs $0.035. Subscription discounts apply; see the actor's current pricing for other tiers. Empty pages and refused requests do not trigger result or enrichment charges; actor start still applies.

One detailed story with 11 comments produces **12 result-item events + 2 enrichment events + actor start**, totaling **$0.0726** at those rates.

### Output Example

> Sample shape, values are illustrative placeholders, not from a live story.

```json
{
  "kind": "story",
  "id": "00000001",
  "title": "Sample Story",
  "url": "https://pikabu.ru/story/sample_story_00000001",
  "author": {"id": "0000", "name": "Sample Author", "url": "https://pikabu.ru/@sample_creator"},
  "community": null,
  "tags": ["Sample tag"],
  "tagUrls": ["https://pikabu.ru/tag/sample"],
  "rating": 120,
  "pluses": 130,
  "minuses": 10,
  "commentsCount": 11,
  "publishedAt": "2026-01-01T00:00:00+03:00",
  "timestamp": 1700000000,
  "seriesId": null,
  "isLong": false,
  "isPinned": false,
  "blocks": [{"type": "text", "text": "Sample public story text", "links": []}],
  "text": "Sample public story text",
  "images": [],
  "videos": [],
  "media": {"images": 0, "videos": 0},
  "detailFetched": true
}
```

### Send results into your apps (MCP connectors)

Authorize an app connector under Apify Settings, API & Integrations. In the input, open **Export to your apps (MCP connectors, optional)** and select it. Notion requires `notionParentPageUrl`; `maxNotifyListings` limits how many records each connector receives.

Each exported record is a condensed, human-readable summary containing a title and key fields. Nested objects are flattened and arrays are shortened; the full JSON always remains in the dataset. Notion gets a page per record, while other connectors use a best-effort write or digest. Leaving connectors empty skips exports. Export failures preserve the scraped dataset.

### Plan Requirement

An Apify account is required to run the actor. Only publicly available source content is collected; unavailable or removed pages may produce fewer records, and a run where every requested page is refused fails.

### 🔗 More scrapers you might like

Pair this actor with these related scrapers from the same team:

<table>
<tr><td>📱 <a href="https://apify.com/abotapi/wattpad-scraper"><b>Wattpad Scraper</b></a><br>Scrape Wattpad stories by keyword, tag, category, language or URL. Extract authors...</td><td>🏷️ <a href="https://apify.com/abotapi/wildberries-marketplace-scraper"><b>Wildberries Scraper</b></a><br>Scrape Wildberries marketplace: product search with prices (wallet vs retail), discounts...</td></tr>
<tr><td>🛒 <a href="https://apify.com/abotapi/ozon-ru-scraper"><b>Ozon.ru Scraper</b></a><br>Extract structured product data from Ozon.ru, Russia’s largest marketplace. Search by...</td><td>🏠 <a href="https://apify.com/abotapi/cian-ru-scraper"><b>Cian RU</b></a><br>Collect property listings from Cian.ru by search filters or direct URLs. Returns...</td></tr>
<tr><td>🏷️ <a href="https://apify.com/abotapi/avito-ru-scraper"><b>Avito.ru Scraper</b></a><br>From $1/1K. Scrape structured listings from Avito.ru by region, category, filters, or...</td><td>🏠 <a href="https://apify.com/abotapi/domclick-scraper"><b>Domclick RU Property Scraper</b></a><br>Extract property listings from domclick.ru, one of Russia’s largest real estate portals...</td></tr>
</table>

👉 [Browse all abotapi scrapers](https://apify.com/abotapi)

### 💬 Support & custom scrapers

- 🐞 **Found a bug or a missing field?** Open a ticket on the [Issues tab](https://apify.com/abotapi/pikabu-scraper/issues/open). We usually reply within hours.
- 🛠️ **Need another site, extra fields or a private build?** Email <abotapi@proton.me> or message [Telegram @abotapi](https://t.me/abotapi).
- ⭐ **Enjoying it?** A quick review on the actor page helps other users find it.

# Actor input Schema

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

Search runs keyword search. Feed walks hot/new/best feeds, communities, tags or user blogs. Story reads full detail (text, media, comments) for pasted story links. Profile reads creator headers plus their stories.

## `searchQuery` (type: `string`):

Search mode: keyword or phrase (Russian or English). Leave empty with Order set to walk the whole site feed.

## `searchOrder` (type: `string`):

Search mode: result ordering on the site's own search.

## `feedLinks` (type: `array`):

Pikabu feeds, communities, tags, user blogs, story links or bare story IDs. Feed and Story modes accept links from either link field; listings are paginated and individual stories receive full detail.

## `storyUrls` (type: `array`):

Pikabu story links or bare numeric story IDs. Feed and Story modes also accept listing links here. Duplicate stories are collected once.

## `profileUrls` (type: `array`):

Profile mode: pikabu.ru/@name links or bare account names. Each entry returns one profile record with stats and recent stories.

## `fetchDetails` (type: `boolean`):

Feed and search modes: open every collected story for its full text, media and tags. Each successfully returned detailed story has one enrichment event. With Collect comments enabled, additional comment enrichment events use round(returned comments / 10) per story. Off returns cards only.

## `fetchComments` (type: `boolean`):

Collect comments of each opened story as separate records, including author, text, rating, media and parent comment. Every returned comment has the result-item charge. Additional enrichment events per story equal round(returned comments / 10), on top of its story-detail event. For example, 11 returned comments add one enrichment event. Exact halves round to the nearest even integer; suppressed comments are excluded.

## `maxCommentsPerStory` (type: `integer`):

Maximum comment records to return per story; 0 means all available comments, subject to Max items. Comment enrichment charges use round(actual returned comments / 10) per story, not this limit. Exact halves round to the nearest even integer.

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

Stop after this many records (0 = no limit; the run then stops when listings run out). Comments count towards this cap too.

## `proxyConfiguration` (type: `object`):

Connection settings for collecting public Pikabu pages. Use the Console connection editor to configure your run.

## `mcpConnectors` (type: `array`):

Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a page per record; other connectors get a best-effort write or digest. Each connector receives a condensed summary per record, not the full record; the complete record always stays in the dataset. Leave empty to skip; this never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL or id of the Notion page under which record pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on records written to each connector per run. Does not affect the dataset.

## `resumeFromRunId` (type: `string`):

Paste a previous run ID or dataset ID to continue a large pull without returning items already collected there.

## `incrementalMode` (type: `boolean`):

Turn this on for daily or recurring monitoring. The first run returns every matching record as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED records. Turn on Emit unchanged or Emit expired only when you also want those rows returned (and billed).

## `stateKey` (type: `string`):

Optional. Name this monitoring campaign to keep its state stable, or deliberately share state across differently configured runs. Leave empty to let the actor derive a key automatically from the mode and scope settings.

## `emitUnchanged` (type: `boolean`):

Off by default. Turn on to also return records that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have.

## `emitExpired` (type: `boolean`):

Off by default. Turn on to also return records that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked scope.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "steam",
  "searchOrder": "relevance",
  "feedLinks": [
    "https://pikabu.ru/"
  ],
  "storyUrls": [
    "14366779"
  ],
  "profileUrls": [
    "https://pikabu.ru/@admin"
  ],
  "fetchDetails": true,
  "fetchComments": true,
  "maxCommentsPerStory": 0,
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxNotifyListings": 50,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# 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 = {
    "mode": "search",
    "searchQuery": "steam",
    "searchOrder": "relevance",
    "feedLinks": [
        "https://pikabu.ru/"
    ],
    "storyUrls": [
        "14366779"
    ],
    "profileUrls": [
        "https://pikabu.ru/@admin"
    ],
    "fetchDetails": true,
    "fetchComments": true,
    "maxCommentsPerStory": 0,
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    },
    "incrementalMode": false,
    "emitUnchanged": false,
    "emitExpired": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/pikabu-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 = {
    "mode": "search",
    "searchQuery": "steam",
    "searchOrder": "relevance",
    "feedLinks": ["https://pikabu.ru/"],
    "storyUrls": ["14366779"],
    "profileUrls": ["https://pikabu.ru/@admin"],
    "fetchDetails": True,
    "fetchComments": True,
    "maxCommentsPerStory": 0,
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": True },
    "incrementalMode": False,
    "emitUnchanged": False,
    "emitExpired": False,
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/pikabu-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 '{
  "mode": "search",
  "searchQuery": "steam",
  "searchOrder": "relevance",
  "feedLinks": [
    "https://pikabu.ru/"
  ],
  "storyUrls": [
    "14366779"
  ],
  "profileUrls": [
    "https://pikabu.ru/@admin"
  ],
  "fetchDetails": true,
  "fetchComments": true,
  "maxCommentsPerStory": 0,
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false
}' |
apify call abotapi/pikabu-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,abotapi/pikabu-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/xYzmCOYky4p9MNLnS/builds/YykXdw2X6F9ikqfe2/openapi.json
