VK serves a client that is not logged in one extractable word. We measured the official VK community page through proxy exits in Germany, the United States and Kazakhstan on 28 September 2026: every exit was redirected from vk.com to vk.ru, received 179,861 to 188,502 bytes tagged noindex,nofollow, and yielded 1 word; rendered in a browser, 8 words from Germany and 1 from the other two. The API called without a token answered in 220 bytes naming the missing key. On VK the setting is the API with a service token, on the cheapest exit you have.
Every page on the first Google result page for this keyword sells the same thing: access to VK from a country where it is restricted, with a login. That is a VPN use case for a person with an account, and it is not what this article measures. We measured what the platform gives a program that has no account, from three countries, and the answer is the same number three times.
Three exits, one word, and a redirect to vk.ru
We audited vk.com/vk, the platform's own community page, with and without JavaScript from three proxy exits chosen to make the geography argument: Germany inside the EU, the United States, and Kazakhstan, a market where VK is a mainstream network.
| Exit country | Plain HTTP | Rendered in a browser | Final URL |
|---|---|---|---|
| Germany | 1 word, 188,502 bytes, noindex | 8 words, no title, no canonical | vk.ru/vk |
| United States | 1 word, 179,861 bytes, noindex | 1 word | vk.ru/vk |
| Kazakhstan | 1 word, 179,861 bytes, noindex | 1 word | vk.ru/vk |
Three things in that table are worth more than the word count. First, the redirect: every request to vk.com landed on vk.ru, from inside the EU, from the US and from Central Asia alike. If your job still hardcodes vk.com, it is following a redirect on every call and comparing canonicals that no longer match. Second, the size: 180 KB is not an error page, it is the application shell, shipped with an x-robots-tag: noindex,nofollow header and a windows-1251 charset, and with no title, no canonical and no text for a client that has not authenticated. Third, the geography: the Kazakh exit, from a country where VK is a home network, received byte-for-byte the same 179,861 bytes as the American one. The exit country is not the variable.
The rendered pass confirms it from the other side. A real browser from Germany got 8 words; from the US and Kazakhstan, 1. There is no client-side hydration to wait for, because there is no anonymous view to hydrate. This is the opposite of Bluesky, where the same request from five countries returned identical public data and the country only changed a moderation header. On VK the country changes nothing and the account changes everything.
The mobile site says it out loud, in the exit's language
The mobile web address, m.vk.com/vk, redirected to m.vk.ru/vk and returned 102,302 bytes from Germany and 102,241 from Kazakhstan, each with about 80 words. Those words are a single message telling the visitor the browser is outdated and offering two download links, with an act=no_js beacon at the bottom. From the German exit the message came in German: Ihr Browser ist veraltet. The page carries a canonical of vk.ru/vk and the title VK.com | VK, and no community content.
That is the one thing the exit country does change on VK: the language of the stub. A parser that keys on English or Russian interface strings will misclassify the same response from a German exit. It is the same lesson as the German follower labels on Facebook, reduced to its smallest possible case. Pin the country for the duration of a job and do not read meaning into the stub's text.
We also tried the old FOAF endpoint, vk.com/foaf.php?id=1, which for years returned an XML profile summary. It now returns 0 bytes of body. Tutorials that mention it describe a VK that no longer answers.
The API answers without a token, and tells you which token it wants
Here is the number that matters. We called api.vk.com/method/groups.getById?group_id=vk&v=5.199 from the German exit with no credentials at all and received 220 bytes of JSON: error_code 15, Access denied: token required, and an echo of the request parameters including oauth: 1. The API endpoint is reachable from the EU, it answers a plain HTTP client instantly, and its error is structured and specific. That is the surface to build on.
VK's developer documentation describes three access keys, and the choice decides your throughput more than any proxy does:
| Access key | What it is for | Documented limit |
|---|---|---|
| User token | Acting as a person who authorised your app | 3 requests per second |
| Community token | Managing a community you administer | 20 requests per second |
| Service token | Reading open data with no user session | 5 requests per second up to 10,000 app users, rising in steps to 60 per second above 1,000,000 |
Exceed the limit and the server answers error 6, Too many requests per second, again as JSON. The service token is the one for public-data work: it needs a registered application and no user login, and it is what the open methods such as groups.getById, wall.get on public walls and users.get on public profiles expect. The limit is per application, not per IP, so proxies do not raise it. What proxies do on VK is narrower and still real: keep a stable exit for the app's traffic, and keep the API reachable from infrastructure whose route to api.vk.com is otherwise unreliable.
curl -s -x http://PROXY_HOST:PORT -U 'USER:PASS' \
'https://api.vk.com/method/groups.getById?group_id=vk&v=5.199' \
-H 'Authorization: Bearer SERVICE_TOKEN'
# without the header: 220 bytes, error_code 15, "Access denied: token required"
What it costs, and why the network price barely matters
The web stub is 179,861 to 188,502 bytes for one word. The API error is 220 bytes. A successful groups.getById response is a few kilobytes. On this platform bytes are not the cost driver; the per-application rate limit is. All figures count 1 GB as 10^9 bytes.
| How you fetch it | On-wire bytes | What you get | Per GB | Cost at $0.50/GB |
|---|---|---|---|---|
| Community page, plain HTTP, any exit | 179,861 to 188,502 | 1 word, noindex shell | ~5,300 pages | $0.00009, wasted |
| Community page, rendered | not measured for bytes | 1 to 8 words | n/a | wasted |
| Mobile page, plain HTTP | 102,302 | 80 words of outdated-browser notice | ~9,775 pages | $0.00005, wasted |
| API groups.getById, no token | 220 | JSON error naming the token | ~4,545,000 calls | $0.0000001 |
At 5 requests per second, a new application's service token allows 432,000 calls a day. If each answer averages 4 KB, that is about 1.7 GB a day, or about $0.86 at the rotating rate, for the whole of a day's quota. The cheapest network is the correct one because nothing on VK is scoring the IP for anonymous reads: the web gave every exit the same one word, and the API gave the EU exit a clean, structured answer. A rotating endpoint from $0.50/GB is enough; residential from $0.80/GB and mobile from $2.30/GB buy nothing measurable here.
Our web scraping API at $0.0002 per page will return the vk.ru shell faithfully, one word and all; do not pay $0.001 to render it. Use the API for the pages around VK, the sites communities link to, and call api.vk.com directly for VK itself.
What VK's own files permit
The robots.txt is 6,175 bytes, last modified 12 May 2026, with about 75 Disallow lines for every client: /feed, /friends, /bookmarks, every ?w=wall, ?w=story and ?w=photo overlay, wall search, /write-, anything carrying api_access_key=, and its own rate-limit error page. Googlebot and Yandex get near-identical sections, and Yandex additionally a Clean-param list of twenty tracking parameters. Community pages and public wall permalinks are not excluded by the file, which is why they appear in search engines; the anonymous web view simply does not carry their text.
The terms page, vk.com/terms, redirected to vk.ru and served our plain client 131,762 bytes with 7 words, so we cite it without quoting it. The plain line is the API's: use a service token you registered, stay under the documented per-second limit, read only methods marked as open, and do not automate accounts, friend requests or messages. Access from countries where VK is restricted is a matter for the person holding the account and the law of that country, not a proxy setting we recommend.
What this is properly for: monitoring public communities where your brand or product is discussed, checking your own community's public data from another country, researching open group statistics through the documented methods, and social listening on public walls at the pace the service token permits. Not: scraping people, harvesting members, or running accounts.
The setting that works on VK
- Network: rotating, from $0.50/GB. Three exits in three countries received the identical one-word shell; nothing scored the network. Buy bytes, not trust.
- Fetch mode: the API, engine: tls. The web returned 1 word plain and 1 to 8 words rendered from every exit; api.vk.com answered a plain client in 220 bytes of structured JSON.
- Country to pin: any; the only thing it changed was the language of the mobile stub (Ihr Browser ist veraltet from Germany). Keep it fixed so the stub's text stays constant for your classifier, and point every URL at vk.ru, where all three exits were redirected.
- Token: a service token for open data, 5 requests per second for an application under 10,000 users, 60 per second above a million. The limit is per application; proxies do not raise it.
- When the proxy is not enough: for discovering which public VK communities and posts rank for a topic, the Google search collector returns URLs, titles and snippets as rows without touching vk.ru; the web scraping API reads the sites those communities link to at $0.0002 per page.
- Free tier: every account gets $2 of free API usage per month.