OK.ru Scraper - Users, Groups, Posts, Videos & Games
Pricing
from $1.40 / 1,000 result records
OK.ru Scraper - Users, Groups, Posts, Videos & Games
Scrape public OK.ru users, groups, topics, posts, videos, games and greetings by keyword or URL. Extract profiles, feeds, views, likes, comments, players and ratings as clean JSON, with change tracking for recurring monitoring. No account required.
Pricing
from $1.40 / 1,000 result records
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
16
Total users
8
Monthly active users
13 days ago
Last modified
Categories
Security
Limited permissionsShare
OK.ru Scraper: Profiles, Groups, Topics, Videos & Games
OK.ru Scraper turns Odnoklassniki (OK.ru), one of Russia's largest social networks, into structured data. Search users, groups, topic posts, videos or games by keyword, or paste any mix of ok.ru links, groups, topic posts, profiles, videos, the video showcase, the games catalogue or a single game, and greetings pages, each entry is auto-detected and read by the matching lane. Records come back as clean JSON: profiles with name, gender, birthday and location, groups with members and feed cards, videos with views, likes and comments, games with players and ratings. Everything works without logging in. Schedule the same input on a recurring basis and get only new and changed records, then export to JSON, CSV or Excel, or read the results through the API.
Why This Scraper?
- No login, ever. Search, group feeds, topic posts, videos, games and profile enrichment all work from what the site shows logged out visitors; you never provide an account.
- Many ways in. Search users, groups, topic posts, videos or games by keyword (one query or a list of queries), or paste any mix of links, groups, topics, profiles, videos, the video showcase, the games catalogue or a single game, and greetings pages, each auto-detected.
- Output tabs and run summary. The Output tab has separate views for overview, profiles, groups and topics, videos, comments (one row per comment), games, greetings and incremental changes. Each run also saves an
OUTPUTrecord in the key-value store with counts per record kind and the refused, not found and unchanged counts. - Videos and games with real engagement. Views, likes, duration and publish date for every video, players and rating with vote count for every game. Turn on Include comments to nest the first page of comments; the site serves at most the first 20 comments, oldest first, to logged out visitors, so that is the ceiling and deeper pages are not collected.
- Monitoring built in. Schedule the same input on a recurring basis and receive only new and changed records, each marked
NEWorUPDATED, with the changed fields listed. - Loud on blocks. When the site refuses every request, the run fails with a clear message instead of finishing quietly with no results.
Use Cases
- Community researcher: track group membership, category and recent feed activity for public communities.
- OSINT analyst: turn a bare profile ID or link into structured name, gender, birthday and location.
- Video and channel monitor: track views, likes and comments for individual OK.ru videos over time.
- Games market analyst: compare player counts, ratings and genres across the whole games catalogue or one genre.
- Recurring content monitor: schedule a search or a fixed list of links daily and get only what is new or changed.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
kind | "profile" (also "group", "topic", "video", "game", "greeting") |
id | "123456789012" |
url | ok.ru link to the record |
name | "Sample Group" (profile, group and game records) |
title / text | "Sample topic title" / "Sample post text" (topic, video and greeting records) |
firstName / lastName / gender | "First" / "Last" / "male" (profile) |
birthday / location / avatar | "05-12" / "Sample City, Sample Country" / avatar image URL (profile) |
membersCount | 214187 (group) |
description / category | "Sample description" / "Board games" (group and game search rows; a greeting's category is its topic, for example "Happy birthday") |
feedCount / feedTexts | 10 / recent feed post texts (group link rows) |
groupId / commentsCount | "53494783737943" / 42 (topic and video records) |
images / comments | image URLs (topic) / first page of comments, up to 20, with Include comments on (video and topic) |
durationSeconds / publishedAt | 125 / ISO timestamp (video) |
durationMs / createdTimestamp / provider / blocked | 125000 / epoch milliseconds / upload source name / false (video; empty when the site does not expose them) |
viewsCount / likesCount / dailyViews | 150000 / 2400 / 310 (video; daily views on search rows) |
channelName / channelUrl / ownerType / ownerId | "Sample Channel" / channel link / "group" / "1234567890" (video; the name only on video link and showcase rows) |
genre / tags | "board" / ["Board games"] (game; genre only from the games catalogue and game links, not game search) |
playersCount | 955000 (game) |
rating / ratingVotes | 4.32 / 145000, null when a game has no votes yet (game) |
developer | "Sample Studio" (game search rows and single game links, not catalogue pages) |
changeType / firstSeenAt / lastSeenAt | "NEW" / ISO timestamps (incremental mode only) |
Profile records also carry age and online status when the site's own search returns them. Video records also carry width, height, a thumbnail image URL, and isLive / isAdult flags where the site marks them; channelName and isAdult only come from a direct video link or the showcase, not from search rows. Game records also carry a shortName slug, is18plus and isNew flags, image and banner URLs, and a topicUrl link to the game's discussion topic when the site provides one. Greeting records also carry tags, the category link titles shown with that greeting.
How to Use
- Pick a mode:
search(by keyword) orlinks(paste any mix of ok.ru links). - In search mode, set the search query and the types to search. In links mode, paste your links; groups, topics, profiles, videos, games and greetings pages are each auto-detected.
- Turn on Include comments if you want the first page of video and topic comments nested in each row, and set Max items to control run size and cost.
- Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API.
Search users by keyword:
{"mode": "search","searchQuery": "котики","searchTypes": ["users"],"maxItems": 100}
Paste any mix of links; groups, topics and profiles are auto-detected per entry:
{"mode": "links","links": ["https://ok.ru/group/53494783737943","https://ok.ru/group/53494783737943/topic/158816426481751","https://ok.ru/profile/352769811913"]}
Supported link shapes: group page, group topic post, profile, video, video showcase (/video), games catalogue, games genre, single game, greetings index, greetings category, the mobile host (m.ok.ru) of any of these, and a search page link such as /search?st.query=котики (the query and tab are run as a search). A link that is not recognised is skipped with a warning in the log. In links mode with the field left untouched, the actor now scrapes one example of each shape (12 links) instead of three; clear the list or paste your own to change that.
One query across videos, games and groups at once, with video and topic comments included:
{"mode": "search","searchQuery": "котики","searchTypes": ["videos", "games", "groups"],"maxItems": 50,"includeComments": true}
Daily monitoring of a group search, named so the state stays stable:
{"mode": "search","searchQuery": "фитнес","searchTypes": ["groups"],"incrementalMode": true,"stateKey": "fitness-groups","maxItems": 200}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/ok-ru-scraper").call(run_input={"mode": "search", "searchQuery": "котики", "searchTypes": ["users"]})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row["kind"], row.get("name") or row.get("title"))
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/ok-ru-scraper').call({mode: 'search', searchQuery: 'котики', searchTypes: ['users'],});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
How Max items applies
In search mode, Max items is a fresh budget for each selected type: three types with Max items 50 can return up to 150 records total, 50 of each. In links mode, Max items is one shared budget across the whole link list.
Search pagination (users, topic posts, groups, videos and games) stops as soon as one page brings nothing new, even if the site says more pages exist. This avoids looping forever on a search whose ranking repeats itself near the end of the results. The tradeoff: if the site serves one fully repeated page in the middle of a long result list, that search stops there and never reaches the genuinely new results further down. Those records are simply not collected in that run (and are not billed); in Incremental mode they show up as NEW on a later run that reaches them. If a broad query returns noticeably fewer records than Max items, run it again or split it into narrower queries.
The same rule applies across types in one run: Topic posts search also returns the groups those posts belong to, and Groups search skips any group already returned that way. A group is never returned twice, but if Topic posts runs first and already covered a whole page of group results, Groups search stops there. When you need a full group list, run Groups search on its own.
Resume and recurring updates
Two different features for two different situations:
- Resume (
resumeFromRunId): paste a previous run's run ID or dataset ID to continue an interrupted crawl without returning (or billing) records already collected there. Records are matched by kind and id. - Incremental mode (
incrementalMode, default off): for scheduling this actor on a recurring basis (daily, hourly) with the same input, and getting only what changed. State is kept in a key value store. Without astateKey, the key is derived from what is searched (search mode: the query or queries and search types; links mode: the links), so changing Max items, Emit unchanged, Resume or export settings keeps your state; setstateKeyto keep one state across any input change, or to share it between tasks. State is saved only when the run finishes, so a run that is aborted or times out does not update it, and the records it returned come back asNEW(and are billed again) next time. Every record is classifiedNEW(first time seen for this state key),UPDATED(content changed since last seen;changedFieldslists what changed; counters, the avatar URL and feed texts never count as a change, seeignoreFieldsForChanges) orUNCHANGED(nothing changed, suppressed and not billed unlessemitUnchangedis on). This actor does not track or emitEXPIREDorREAPPEAREDrecords: a record that disappears from the site simply stops appearing in later runs, it is not flagged. Every incremental record carrieschangeType,firstSeenAtandlastSeenAt. WithincrementalModeoff, output is unchanged: same records, same charges as before.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape, the Apify dataset is never changed.
What gets written to the connector: a condensed, human readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify, Settings, API & Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the connector input field. If the picker is empty, you have not authorized a connector yet.
- For Notion, also set
notionParentPageUrlto the page where items should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search runs the site's own search (profiles, groups, topic posts, videos or games); links reads any ok.ru links, auto-detected per entry. |
searchQuery | string | (none) | Search mode: keyword or phrase, Russian or English. |
searchQueries | array | (none) | Search mode: extra keywords searched in the same run after the query above; Max items applies to each type of each query, repeats are returned once. |
searchTypes | array | ["users"] | Search mode: one or more of users, groups, content, videos, games; each is searched for the same query and Max items applies to each type. |
links | array | one example link of each supported shape | Links mode: any mix of ok.ru links or bare profile IDs, groups, topics, profiles, videos, the video showcase, the games catalogue or a genre, one game, and greetings pages. |
maxItems | integer | 20 | Stop after this many records (0 = the hard ceiling of 100000 per run). In search mode the limit applies to each selected type. |
includeComments | boolean | false | Nest the first page of comments (up to 20, oldest first) inside video and topic records. Each record returned with comments is charged one small Comments collected event; records without comments are not. |
resumeFromRunId | string | (none) | Paste a previous run ID or dataset ID to continue a large pull. |
incrementalMode | boolean | false | Turn on for daily or recurring monitoring; returns only new and changed records on later runs. |
stateKey | string | (none) | Name this monitoring campaign to keep its state stable. Leave empty to derive a key from the run settings. |
emitUnchanged | boolean | false | Also return (and bill) records that have not changed since the last run. |
ignoreFieldsForChanges | array | [] | Incremental mode only. Extra field names that never make a record UPDATED (they stay in the output). Built in: view, like, comment, player and member counters, vote counts, avatar URL and feed texts. Use a dot for nested fields. |
mcpConnectors | array | (none) | Optional: send a summary of each record to apps you authorized under Integrations. |
notionParentPageUrl | string | (none) | Notion connector only: page under which item pages are created. |
maxNotifyListings | integer | 50 | Cap on items written to each connector per run. Does not affect the dataset. |
proxyConfiguration | object | Apify Proxy | Connection settings. |
Output Example
Sample shape: values are illustrative placeholders, not from a live record.
{"kind": "profile","id": "123456789012","name": "First Last","firstName": "First","lastName": "Last","url": "https://ok.ru/profile/123456789012","gender": "male","birthday": "05-12","location": "Sample City, Sample Country","avatar": "https://i.okcdn.ru/i?r=SampleAvatar","changeType": "NEW","firstSeenAt": "2026-09-27T09:00:00+00:00","lastSeenAt": "2026-09-27T09:00:00+00:00"}
Plan Requirement
The default Apify Proxy connection (datacenter) reads every supported page shape in our checks, so no residential proxy is needed. The run first checks which connection your account can use. If the selected connection is unavailable (for example an Apify free plan, which has no residential proxy), the log shows "The selected connection is unavailable to this run" and the run continues on a backup connection, noting "Served over the backup connection" for results fetched that way; some pages may still be unavailable. If your account has no proxy access at all, the run fails with "The proxy connection was refused for this account, so no page could be read" and points to a paid plan, or to your own proxy URLs if you supplied them. If the backup cannot load the pages either, it fails with "No results: residential proxies are unavailable on this run". If requests fail for another reason, the message is "Could not load any results page ... This is a connection problem, not an empty search". In every case the run fails loudly instead of finishing with no results, so "nothing matched" is never confused with "nothing could be read".
FAQ
How much does it cost?
You pay per record returned, plus a small extra charge for records returned with comments when Include comments is on. The Pricing tab shows the current rates. Use Max items to cap the cost of any run; it has a hard ceiling of 100000 records per run.
Is it legal to scrape OK.ru?
This actor collects only publicly available data that the site itself shows to logged out visitors. You are responsible for how you use it: follow OK.ru's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Names, photos and other personal data may be subject to privacy and data protection rules in your jurisdiction.
Can I get only new or changed records on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Later runs then return only new and updated records; unchanged ones are not billed unless you turn on Emit unchanged. There is no EXPIRED or REAPPEARED tracking: a record that disappears from the site just stops showing up, it is not flagged.
Why did I get fewer records than Max items?
In search mode, a search stops as soon as one page brings nothing new, even if the site says more pages exist, so on a broad query it can stop before the real end of the results; those records are not collected (or billed) in that run. Run it again or split it into narrower queries. If you selected both Topic posts and Groups, groups already returned by the topic posts search are skipped, and Groups search can stop early for the same reason; run Groups search on its own for a full list. See How Max items applies above. In links mode, each entry is read once, so the count depends only on how many links you pasted and what the site returns for each.
Does Resume from a previous run skip records I already have?
Yes. Paste the earlier run or dataset ID into resumeFromRunId; records already in it are skipped and not billed.
Why did my run fail instead of returning an empty dataset?
If the site refuses every request, the run stops with a clear message so "nothing found" is never confused with "nothing could be read". The same applies in links mode when none of your links can be read, for example because they do not exist on OK.ru: the run fails instead of returning empty or placeholder records. Run it again in a few minutes, or check the link.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
🔗 More scrapers you might like
Pair this actor with these related scrapers from the same team:
| 🧩 Pikabu Scraper Scrape Pikabu (Пикабу): keyword search, hot/new/best feeds, communities, tags, full story... | 🧩 Dzen.ru Scraper Scrape Dzen.ru (ex Yandex.Zen): articles, videos and channels. Full article text with... |
| 🧩 Roblox Scraper Scrape Roblox experiences, marketplace items, users and communities. Player counts... | 🛒 Ozon.ru Scraper Extract structured product data from Ozon.ru, Russia’s largest marketplace. Search by... |
| 💼 HH.ru Jobs Scraper Scrape HH.ru job listings with 50+ structured fields. Search by filters or URLs and... | 🧩 TikTok Comments Scraper Scrape comments from TikTok videos using one or more video URLs or IDs. Extract comment... |
💬 Support
- 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- 🛠️ Need another site, extra fields or a private build? Email contact@abotapi.com.
- ⭐ Enjoying it? A quick review on the actor page helps other users find it.