Answers
How do I track how a Bilibili video's views grow over time?
Short answer
Poll Bilibili video detail with the BV id on a schedule and store each reading with its timestamp. Each reading costs $0.002, so hourly tracking for a week is $0.336 per video, and ten videos for a week is $3.36. You get views, likes, coins, favorites and danmaku count in every reading.
Your sponsored video goes live on Friday at 8 pm, and the creator promised 300,000 views in the first week. You would like to see the curve, not just the final number: did it take off on Saturday, stall on Monday, get a second wind when it hit the popular board? Bilibili shows only the current count, so the way to get a curve is to read that count on a schedule and keep every reading.
The endpoint
Bilibili video detail returns a video's current numbers by BV id. With view=full each reading carries views, likes, comments, shares and favorites, plus coins and danmaku count under ext. The response also has meta.fetched_at, the time to plot against.
What a schedule costs
| Plan | Readings | Cost |
|---|---|---|
| Hourly for the first 24 hours | 24 | $0.048 |
| Hourly for 7 days, one video | 168 | $0.336 |
| Hourly for 7 days, ten videos | 1,680 | $3.36 |
| Daily for 30 days, one video | 30 | $0.06 |
A sensible plan is hourly for the first three days and daily after that. Most of a Bilibili video's views arrive early.
A script for cron
Run it every hour with 0 * * * * python track.py:
import csv, datetime, os, requests
URL = "https://api.okdata.online/v1/bilibili/videos/get"
H = {"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"}
VIDEOS = ["BV1xx411c7mD"]
hour = datetime.datetime.utcnow().strftime("%Y%m%d%H")
with open("views.csv", "a", newline="") as f:
w = csv.writer(f)
for bv in VIDEOS:
# One key per video per hour: if cron retries, the second run replays for free.
headers = {**H, "Idempotency-Key": f"{bv}-{hour}"}
body = requests.get(URL, headers=headers, params={"id": bv, "view": "full"}, timeout=60).json()
if body["code"] != "ok":
print(bv, body["code"], body["message"])
continue
v = body["data"]["item"]
w.writerow([body["meta"]["fetched_at"], bv, v["metrics"]["views"], v["metrics"]["likes"],
v["ext"]["coins"], v["metrics"]["favorites"], v["ext"]["danmaku"]])
Open views.csv in a spreadsheet and chart views against time, or diff consecutive rows to get views per hour.
What to expect from the numbers
- Bilibili updates its public counter in batches, so an hour can look flat and the next one jumps. Read trends over several hours, not single steps.
- Polling every minute buys you nothing: the counter does not move that fast, and each reading is a paid call.
- These are the public numbers anyone can see. Completion rate, traffic sources and audience data stay inside the uploader's creator center.
- If the video is taken down, the call returns
not_foundand is not charged.
Better options in some cases
If you sponsored the video, ask the creator for a creator-center export after a week. It has data no outside reading can match, and the hourly public curve is a good way to check it. Third-party analytics dashboards also chart Bilibili videos if you prefer a ready-made view, and the open-source bilibili-api library can do the same polling for free if you run and maintain it. For tracking a whole set of rivals rather than one video, see the competitor monitoring guide.
Updated