Bilibili is China's YouTube for the under-35s, and it is the most readable social platform we have measured. On 28 September 2026 we fetched it 21 times through residential exits in Singapore, the United States and Germany. A public video page answers a plain HTTP client with 230,769 bytes, a VideoObject JSON-LD block, a canonical, an h1 and a hydration state carrying the exact view, like, coin and favourite counts. Rendering it costs 1,696,995 bytes, 7.35 times more, and from the United States the render added not one word. Three keyless API endpoints returned JSON from every country, the smallest a follower count in 158 bytes.
The keyword is shopping agents and a reverse proxy, not data
Bilibili proxies has no autocomplete. The United States SERP for it is Reddit users looking for an agent to buy digital items on Bilibili for them, a GitHub gist that reverse-proxies the live-stream API for a home server, a Go package from Bilibili's own engineering, two VPN pages for watching from abroad, the overseas bilibili.tv site and the investor relations page. The data reader is under bilibili api, whose autocomplete lists a community documentation project, python, github and an error code, and under bilibili scraper: github, comment scraper, video scraper. This page is for that reader: public video metrics, creator statistics and trend monitoring, with the platform's rules read as far as they can be read.
The video page is server-rendered, counters included
We audited bilibili.com/video/BV14Baa6JENd, the anniversary song video from Genshin Impact's official account, which was ranked first on the site's own popular list that afternoon. Over plain HTTP with no JavaScript, from three countries:
| Exit | No-JS words | Rendered words | JSON-LD | Audit time |
|---|---|---|---|---|
| Singapore | 158 | 325 | WebPage, VideoObject, BreadcrumbList | 19.5 s |
| United States | 154 | 158 | WebPage, VideoObject, BreadcrumbList | 10.1 s |
| Germany | 157 | 341 | WebPage, VideoObject, BreadcrumbList | 14.0 s |
The title, description, canonical and h1 were present without JavaScript from every exit. The audit's word count is low because Chinese has no spaces; the markdown conversion of the same 230,769-byte response came to 963 words and 6,631 characters in 3.0 seconds. The rendered page produced 962 words from 1,696,995 bytes in 9.5 seconds, and from the United States the rendered audit returned 158 words, the same as the no-JS pass: the browser added the comment scaffold and the recommendation rail and nothing you would parse.
The part that makes this platform different is inside the plain HTML. Bilibili embeds its hydration state in the page, and we mined it from the no-JS response: 226,564 bytes of JSON carrying the exact counters.
"stat": {
"view": 1859557, "danmaku": 35770, "reply": 16506,
"favorite": 90176, "coin": 185836, "share": 37474,
"like": 295569, "his_rank": 1
}
The visible page prints the same view count as 185.9万, rounded to a tenth of ten thousand. The state has the integer. On Instagram and Facebook the counters live in a meta description and are rounded or formatted by locale; on Bilibili they live in a JSON object with seven exact fields, plus the owner's follower count, 20,871,893, in the same blob. No render, no API call, one request.
Removed videos are a classifier problem, as everywhere. A video that no longer exists returned HTTP 200 with the title "where did the video go", 15 words without JavaScript and 41 rendered, and a meta description with unfilled template placeholders and the literal string undefined. Classify on the presence of a VideoObject block and a filled description, never on the status code.
Three endpoints answer without a key, and one answers with HTML
Bilibili's web API on api.bilibili.com is undocumented by the company and thoroughly documented by its community. We called four endpoints over plain HTTP with no cookie and no signature:
| Endpoint | Exit | Bytes | Time | What it returns |
|---|---|---|---|---|
| /x/relation/stat?vmid= | Singapore | 158 | 1.7 s | follower 20,871,893, following 60 |
| /x/web-interface/card?mid= | United States | 2,496 | 0.94 s | name, verification, fans 20,871,897, 742 videos, 286,304,702 likes |
| /x/web-interface/popular?ps=5 | Singapore, US, Germany | 9,086 / 9,086 / 9,098 | 0.9 / 0.9 / 0.46 s | 5 videos with full stat objects and upload region |
| /x/web-interface/view?bvid= | Singapore, US | 3,400 | 2.2 / 1.5 s | an HTML page, not JSON |
The first three are the working set. The relation endpoint is the cheapest structured fact we have measured on any social platform: 158 bytes for an exact follower count, about 6.3 million reads per gigabyte. The card endpoint adds the display name, the official verification title, the video count and the lifetime like total. The popular endpoint is a ready-made trend feed: each of its rows carries the same seven-field stat object as the page, the creator's id and name, and a pub_location field naming the province or region the video was uploaded from, which is a signal no Western platform exposes.
The view endpoint is the one to avoid from a bare client: it answered a plain TLS request from both Singapore and the United States with a 3,400-byte HTML page instead of JSON. You do not need it. The video page itself carries the same stat object in its hydration state, and the popular list carries it for trending videos, so a per-video job reads the page and a per-creator job reads relation and card.
The exit region is acknowledged in a header and changes nothing
Every popular-list response carried a header, x-bili-metadata-ip-region, reading SG, US or DE to match the exit we used. The payload was 9,086 bytes from Singapore and the United States and 9,098 bytes from Germany, a 12-byte difference in the same five rows. The video page was 230,769 bytes with identical head and JSON-LD from all three. So Bilibili sees where you are, tells you so, and serves the same public data anyway. That is the opposite of TikTok, where the exit picks a different backend, and it means the country parameter on this platform is for your own bookkeeping, not for the result. Use a rotating exit for volume and pin nothing.
The creator space page, space.bilibili.com/ plus the id, is the one surface that is browser-only: title and description are server-rendered, the body is 0 words without JavaScript and 28 words after an 8.0-second render. Do not fetch it. The card and relation endpoints hold everything the space page shows, in 2,654 bytes between them.
The most open robots.txt of any platform we have measured
bilibili.com/robots.txt is 65 bytes:
User-agent: *
Disallow: /medialist/detail/
Disallow: /index.html
Two paths, no named crawlers, no AI block, nothing about video, space or API. By contrast TikTok's file names 25 AI crawlers with a flat disallow, Naver's carries an all-caps notice against AI training, and Kuaishou's closes with a wildcard disallow. Bilibili's user agreement is the counterweight: the page at /protocal/licence.html is 2,850 bytes and renders 0 words without JavaScript, so we could not read it as a plain client, and we do not claim to know what it says. The line we can state is the usual one for this family: public video and creator metrics are readable as above; anything that touches accounts, votes, coins or comments on the logged-in side is not something we help automate.
What it costs, and what to stop paying for
Because the exit region changes nothing, this is a platform for the cheapest line. Our rotating proxies start at $0.50/GB; the residential Basic line is $0.80/GB. Counting a gigabyte as 10^9 bytes:
| Job | Bytes per request | Requests per GB | At $0.50/GB | At $0.80/GB |
|---|---|---|---|---|
| Follower count, relation endpoint | 158 | 6,329,114 | $0.00000008 | $0.00000013 |
| Creator card | 2,496 | 400,641 | $0.0000012 | $0.0000020 |
| Popular list, 5 videos with stats | 9,086 | 110,059 | $0.0000045 | $0.0000073 |
| Video page, plain HTTP, exact counters | 230,769 | 4,333 | $0.00012 | $0.00018 |
| Video page, rendered | 1,696,995 | 589 | $0.00085 | $0.0014 |
One million follower reads through the relation endpoint is 158 MB, about 8 cents at $0.50/GB. The same million creators through the card endpoint is 2.5 GB, about $1.25. A million video pages over plain HTTP is 231 GB, about $115; rendered, 1,697 GB, about $848, for 167 extra words per page and no extra counters. Skip the browser on this platform entirely.
The setting that works on Bilibili
- Network: rotating, from $0.50/GB. Twenty-one fetches from three countries returned the same public data with a header confirming the region; the network type is not examined on any surface we touched. Residential Basic at $0.80/GB is the fallback if a job also touches surfaces that are.
- Fetch mode:
engine: tls, plain HTTP. The video page returns 963 markdown words and a seven-field stat object from 230,769 bytes; rendered it is 1,696,995 bytes for 962 words, and from the United States the render added zero words to the audit. - Country: any. The popular list was 9,086 bytes from Singapore and the United States and 9,098 from Germany with the same five rows, and the header
x-bili-metadata-ip-regionis the platform telling you it noticed and did not care. - Endpoints:
/x/relation/statfor followers at 158 bytes,/x/web-interface/cardfor the creator at 2,496 bytes,/x/web-interface/popularfor trends at 9,086 bytes. Read per-video counters from the page's hydration state, not from the view endpoint, which answered HTML. - When the proxy is not enough: to find the videos to read, our video search collector returned 10 rows for the anniversary song query in 6.76 seconds, with the video we audited at rank 1 and eight other bilibili.com URLs with duration and date. For pages you want as clean markdown or JSON, the web scraping API is $0.0002 per page without rendering.
- Every account gets $2 of free API usage per month.
For the two sibling platforms measured the same week, where the picture is the reverse, read Douyin, whose user page is a 72,914-byte shell and whose render finished from one exit in three, and Kuaishou, whose profile is server-rendered but whose head lies about what page you are on.