TikTok, Douyin & Bilibili Scraper โ Videos, Profiles, Comments
Pricing
from $1.00 / 1,000 video scrapeds
TikTok, Douyin & Bilibili Scraper โ Videos, Profiles, Comments
Scrape videos, profiles, posts, comments, likes, live streams, and trending feeds from TikTok, Douyin, and Bilibili. Unified JSON schema, no-watermark MP4 URLs, concurrent processing, automatic retries. No API key required.
Pricing
from $1.00 / 1,000 video scrapeds
Rating
2.4
(3)
Developer
Pika Choo
Maintained by CommunityActor stats
6
Bookmarked
170
Total users
12
Monthly active users
4.4 hours
Issues response
20 minutes ago
Last modified
Categories
Share
๐ฌ TikTok, Douyin & Bilibili Scraper โ Videos, Profiles, Comments
Scrape TikTok, Douyin and Bilibili videos, profiles, comments, likes, live streams and trending feeds with one actor for $0.001 per item ($1 per 1,000 videos, comments or profiles). No API key, no login for public data, unified JSON schema across all three platforms, and direct no-watermark MP4 URLs for TikTok.
This is a TikTok scraper, a Douyin scraper and a Bilibili scraper in a single tool: paste any video, profile or live-room URL and the actor detects the platform, fetches the data, retries transient failures on a fresh IP, and writes clean rows to your dataset. Use it as a TikTok data API alternative, a Douyin data extraction tool for the Chinese market, or a Bilibili video data feed for research.
๐ฏ Who uses this TikTok, Douyin and Bilibili scraper?
- ๐ฃ Social media managers tracking competitors and viral trends across Western and Chinese platforms
- ๐จ Content creators sourcing trending music, hashtags and reference videos
- ๐ Market researchers monitoring brand mentions, sentiment and virality on TikTok and Douyin
- ๐ E-commerce teams finding influencers and top-performing product creators
- ๐ค AI / ML teams collecting video, caption and comment data for training or evaluation
- ๐ข Agencies running influencer discovery and campaign measurement
- ๐งโ๐ป Developers and AI agents that need TikTok, Douyin or Bilibili data through the Apify API or MCP without managing cookies, proxies and anti-bot changes
โจ Features
- ๐ 3 platforms in one actor: TikTok, Douyin, Bilibili
- ๐ฌ 7 scraping modes: video detail, user posts, user profile, comments, likes, live info, trending
- ๐ช Auto platform detection: paste any URL and the actor routes it to the right platform
- ๐ Bulk mode: scrape many URLs in a single run, processed concurrently
- โฌ๏ธ No-watermark MP4 URLs: direct video download links (TikTok; Douyin on request, see Platform status)
- ๐ฌ Full comment threads with replies and engagement counts
- ๐ด Live room data: viewer count, title, status, host
- ๐ฅ Trending feeds: Douyin hot search, Bilibili popular
- ๐ Automatic retries: transient failures are retried with backoff on a fresh IP (up to 4 attempts); persistent failures are logged as error rows
- ๐ Unified output schema: the same field names across all three platforms, with the raw platform response included
- ๐ก๏ธ Proxy-ready: Apify residential proxy integration built in
- ๐ TikTok short-link auto-resolve:
vm.tiktok.com/vt.tiktok.comURLs are followed to their canonical video URL before scraping; Bilibilib23.tvlinks are resolved too - ๐ Crash-proof: every failure mode (bad input, anti-bot, unsupported combo, network timeout) becomes a structured
errorrow, never a failed run
๐ค What you get
Every row uses the same unified schema, whichever platform it came from:
| Field | Description |
|---|---|
platform | tiktok, douyin, or bilibili |
item_type | video, user, comment, live, trending, or error |
item_id | Native platform ID (aweme_id, BV-id, comment_id, sec_user_id) |
url | Canonical URL back to the source |
title, description | Caption / title text |
author_id, author_name, author_username | Creator info |
duration_sec, cover_url, video_url_nowm | Video asset fields |
music_title, music_author | Background audio |
hashtags | Array extracted from the caption |
created_at | ISO publish timestamp |
play_count, like_count, comment_count, share_count, collect_count | Engagement stats |
follower_count, following_count, video_count, bio, avatar_url, verified | Profile fields |
comment_id, reply_to_id, comment_text | Comment fields |
live_status, live_title, viewer_count | Live fields |
mode | Mode that produced the record |
error_message, attempts | Populated on error rows only |
raw | Full source API response for advanced users |
scraped_at | ISO timestamp when scraped |
Sample output (TikTok video row)
{"platform": "tiktok","item_type": "video","item_id": "7337889649290054955","url": "https://www.tiktok.com/@charlidamelio/video/7337889649290054955","title": "new dance alert","description": "new dance alert #dance #fyp","author_id": "MS4wLjABAAAA...","author_name": "charli d'amelio","author_username": "charlidamelio","duration_sec": 14,"cover_url": "https://p16-sign.tiktokcdn-us.com/....jpeg","video_url_nowm": "https://v16-webapp.tiktok.com/....mp4","music_title": "original sound","music_author": "charlidamelio","hashtags": ["dance", "fyp"],"created_at": "2024-02-25T18:04:11+00:00","play_count": 12400000,"like_count": 1830000,"comment_count": 9412,"share_count": 21300,"collect_count": 48200,"mode": "video_detail","raw": { "...": "full platform response" },"scraped_at": "2026-08-29T10:12:44+00:00"}
Comment rows fill comment_id, reply_to_id, comment_text and like_count; profile rows fill follower_count, following_count, video_count, bio, avatar_url and verified; live rows fill live_status, live_title and viewer_count. Fields that do not apply to a row are null. Export any run as JSON, CSV, Excel, XML or RSS from the dataset tab or the API.
๐ฅ Input and modes
๐ด Required
| Field | Type | Description |
|---|---|---|
mode ๐ฌ | string | What to scrape. See the mode table below. |
One of url or urls is also required (except for trending mode).
๐ Main fields
| Field | Type | Default | Description |
|---|---|---|---|
platform ๐ | select | auto | auto, tiktok, douyin, or bilibili |
url ๐ | string | none | Single URL: video, user profile, or live room |
urls ๐ | array | none | Bulk list of URLs. Combined with url if both are given. |
maxItems ๐ | integer | 100 | Max items per input URL (paginated modes). 1 to 5000. |
๐๏ธ Options
| Field | Type | Default | Description |
|---|---|---|---|
downloadVideos โฌ๏ธ | boolean | true | Include no-watermark MP4 URLs in output. Auto-disabled for Douyin (Douyin's CDN currently rate-limits these to 403); pass forceDownload: true to override. TikTok and Bilibili are unaffected. |
forceDownload ๐ | boolean | false | Override the Douyin auto-disable above. Use only if you have confirmed your IP or cookie can pull Douyin no-watermark URLs. |
includeComments ๐ฌ | boolean | false | Also fetch a batch of comments alongside video_detail |
cookie ๐ช | string (secret) | none | Browser cookie for private or gated content |
proxyConfiguration ๐ก๏ธ | object | RESIDENTIAL | Apify proxy settings. Residential is strongly recommended. |
๐ฌ Modes ร Platforms
| Mode | TikTok | Douyin | Bilibili | Input expected |
|---|---|---|---|---|
video_detail | โ | โ | โ | Video URL |
user_posts | โ | โ | โ | User profile URL |
user_profile | โ | โ | โ | User profile URL |
video_comments | โ | โ | โ | Video URL |
user_likes | โ | โ | โ | User profile URL |
live_info | โ | โ | โ | Live room URL |
trending | โ | โ | โ | platform only (no URL) |
Unsupported combinations return a clear error record instead of failing the run.
๐งช Examples
Single TikTok video with download URL
{"mode": "video_detail","url": "https://www.tiktok.com/@charlidamelio/video/7337889649290054955","downloadVideos": true}
Bulk: 3 Douyin creators, latest 50 posts each
{"mode": "user_posts","urls": ["https://www.douyin.com/user/MS4wLjABAAAA...","https://www.douyin.com/user/MS4wLjABAAAB...","https://www.douyin.com/user/MS4wLjABAAAC..."],"maxItems": 50}
Top 200 comments on a Bilibili video
{"mode": "video_comments","url": "https://www.bilibili.com/video/BV1GJ411x7h7","maxItems": 200}
Douyin trending feed
{"mode": "trending","platform": "douyin","maxItems": 50}
Bilibili live room
{"mode": "live_info","url": "https://live.bilibili.com/21452505"}
๐ต How much does it cost to scrape 1,000 TikTok, Douyin or Bilibili videos?
$1. Pricing is pay-per-event at a flat $0.001 per item, and you only pay for rows that are successfully delivered:
| Event | Price | Covers |
|---|---|---|
| ๐ฌ Video scraped | $0.001 | Any video row (video_detail, user_posts, user_likes, live_info, trending) |
| ๐ฌ Comment scraped | $0.001 | Each comment |
| ๐ค Profile scraped | $0.001 | Each user profile |
Worked example: scraping the latest 100 posts from 10 creators (1,000 video rows) costs $1.00. Pulling 5,000 comments from a viral video costs $5.00. Failed URLs return an error row and are not billed.
Apify platform usage (compute and proxy) is billed separately by Apify according to your plan. Set ACTOR_MAX_TOTAL_CHARGE_USD on the run to hard-cap spend; once the cap is reached the actor stops charging and marks remaining URLs as error rows.
โ ๏ธ Platform status and known limitations
TikTok, Douyin and Bilibili rotate their anti-bot defenses frequently, and honest expectations matter more than a perfect feature list. The actor handles every failure gracefully (you get a clean error row instead of a failed run), but data may be partial in these specific cases:
| Area | Behavior | What to do |
|---|---|---|
| ๐ถ Douyin no-watermark MP4 URLs | Douyin's CDN currently rate-limits these to 403 | Auto-disabled by default. Metadata still returned. Pass forceDownload: true to attempt anyway. |
| ๐ Douyin user_posts freshness | Douyin's public feed lags by roughly 6 days for some accounts | Use Bilibili or TikTok for time-sensitive monitoring. |
| ๐บ Bilibili download URLs | Bilibili rotates download tokens; some downloads may fail | Metadata and URL are still returned; download with your own client promptly. |
| ๐ต Newer Douyin URL formats | Some short-form Douyin URL shapes are not yet parsed | Use the canonical douyin.com/video/<id> form. |
| ๐ค TikTok user_profile | Some regions return a soft block for profile lookups | Try a residential proxy in a different country group. |
| ๐ฌ TikTok video_comments | TikTok's comment endpoint requires a logged-in session | Paste a fresh TikTok browser cookie into the cookie field. |
We track these continuously and ship fixes as soon as they are available. If a run returns mostly error rows, read the error_message column first: it states which of the cases above applied.
โ FAQ
Does TikTok, Douyin or Bilibili have an official API I could use instead?
TikTok offers a Research API and a Display API, but both require an approved developer application, are limited to specific regions and use cases, and do not return no-watermark video files. Douyin has no public data API for non-Chinese developers, and Bilibili's open API is limited to its own creator ecosystem. This actor returns public video, profile, comment, live and trending data for all three platforms with one input format and no API key.
Do I need a TikTok, Douyin or Bilibili account to scrape data?
No. The actor scrapes public data through the built-in Apify proxy. No login is required for videos, profiles, posts, live rooms and trending feeds. Only a few gated endpoints (TikTok comments, private collections, some Douyin feeds) need a browser cookie.
Can I download TikTok videos without a watermark?
Yes. With downloadVideos: true (the default) each TikTok video row includes video_url_nowm, a direct MP4 URL without watermark. These CDN URLs expire in a few hours, so download and store the file promptly. Douyin download URLs are currently blocked by Douyin's CDN and are disabled by default; see Platform status.
How fast is it and how many URLs can I scrape per run?
URLs are processed concurrently. 100 URLs typically finish in 2 to 3 minutes. There is no hard limit, but we recommend 500 URLs or fewer per run for best reliability and splitting larger jobs into parallel runs.
Can I scrape private accounts?
No. Only public content is supported. For gated endpoints on your own account (private collections, saved videos, TikTok comments) you may pass your browser cookie via the cookie field.
Is scraping TikTok, Douyin and Bilibili legal?
Scraping publicly available data is generally permitted in many jurisdictions, but you are responsible for complying with each platform's terms of service and with privacy laws such as GDPR and CCPA, especially when storing personal data like usernames and bios. Use the data for research, monitoring and analytics, and consult a lawyer for commercial redistribution.
What output formats are available?
Every run writes to an Apify dataset, which you can download as JSON, JSONL, CSV, Excel, XML, HTML table or RSS from the Console or through the API. Three dataset views are included: Overview, Engagement and Full Data.
What happens if a URL is deleted, private or region-blocked?
You get an error row with item_type: "error", a human-readable error_message and the number of attempts made. Each input URL produces exactly one row (or one error row), and you are not charged for error rows.
Can I run this with my own proxy instead of Apify proxy?
Yes. Set custom proxy URLs in proxyConfiguration.proxyUrls. Residential exit IPs work best; datacenter IPs are frequently blocked by TikTok and Douyin.
๐ค Use with AI agents and MCP
The actor is exposed as a tool through the Apify MCP server, so Claude, ChatGPT, Cursor, and any other MCP-compatible agent can scrape TikTok, Douyin and Bilibili data on demand:
https://mcp.apify.com/?tools=fetch-actor-details,openclawai/tiktok-douyin-bilibili-scraper
Add that URL as an MCP server in your client, then ask the agent for things like "get the last 50 posts from this Douyin creator with engagement stats" or "pull 500 comments from this TikTok video and summarize sentiment". A step-by-step guide with agent prompts is at datapika.com/actors/tiktok-douyin-bilibili-scraper.
๐ Integrations: API, Python, JavaScript
Run the actor from anywhere with the Apify API or the official clients.
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("openclawai/tiktok-douyin-bilibili-scraper").call(run_input={"mode": "user_posts","url": "https://www.tiktok.com/@tiktok","maxItems": 50,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["title"], item["play_count"])
JavaScript / TypeScript
import { ApifyClient } from "apify-client";const client = new ApifyClient({ token: "YOUR_APIFY_TOKEN" });const run = await client.actor("openclawai/tiktok-douyin-bilibili-scraper").call({mode: "video_comments",url: "https://www.bilibili.com/video/BV1GJ411x7h7",maxItems: 200,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
REST API
POST https://api.apify.com/v2/acts/openclawai~tiktok-douyin-bilibili-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN
The actor also works with Apify's Zapier, Make, n8n, Google Sheets, Slack and webhook integrations, and can run on a schedule for continuous monitoring.
๐ Troubleshooting
No results for a TikTok URL The video may be deleted, private, or region-blocked. Check the URL in a browser first. Error rows include a status message explaining why.
"Spending limit reached"
You set ACTOR_MAX_TOTAL_CHARGE_USD and the run hit the cap mid-batch. Remaining URLs are skipped and marked as error rows. Increase the cap or split the batch.
Empty dataset on first run
Make sure mode is set and that url / urls match the mode's expected input (video URL for video_detail, profile URL for user_posts).
Bilibili returns 404
The BV-id may be invalid or deleted. Short links like b23.tv/xxx are auto-resolved.
TikTok comments mode returns 0 results
TikTok's comment endpoint requires a logged-in session. Paste a fresh TikTok browser cookie into the cookie input field. Videos, profiles, and posts work without a cookie; comments need one.
๐ก๏ธ Legal and ethics
- Scrapes public data only.
- You are responsible for compliance with each platform's terms of service and your local laws (GDPR, CCPA, and others).
- Personal data handling: store and transmit it in line with applicable regulations, and honor deletion requests.
โญ Support
If something is not working, open the run, view the log, and attach the run URL when reaching out. The actor auto-populates error rows with context, so paste those too. Feature requests and platform-change reports are welcome through the Issues tab on this page.