TikTok, Douyin & Bilibili Scraper — Videos, Profiles, Comments
Pricing
from $5.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 $5.00 / 1,000 video scrapeds
Rating
2.0
(1)
Developer
Pika Choo
Maintained by CommunityActor stats
4
Bookmarked
163
Total users
22
Monthly active users
4.4 hours
Issues response
18 hours ago
Last modified
Categories
Share
🎬 TikTok, Douyin & Bilibili Scraper
Scrape videos, profiles, comments, likes, live streams, and trending feeds across TikTok, Douyin, and Bilibili — all in one actor. Unified JSON schema, no API key required, direct MP4 downloads, from $0.002 per item.
🎯 Who needs this?
- 📣 Social media managers tracking competitors and viral trends across Western + Chinese platforms
- 🎨 Content creators sourcing trending music, hashtags, and reference videos
- 📊 Market researchers monitoring brand mentions, sentiment, and virality
- 🛒 E-commerce teams identifying influencers and top-performing product creators
- 🤖 AI / ML teams collecting training data for video, caption, or comment analysis
- 🏢 Agencies running influencer discovery and campaign measurement
✨ 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, 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)
- 💬 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 retried with backoff; persistent failures logged as error rows
- 📊 Unified output schema — the same field names across all three platforms (raw response also 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 - 🛟 Crash-proof — every failure mode (bad input, anti-bot, unsupported combo, network timeout) becomes a structured
errorrow, never a failed run
📥 Input
🔴 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 | — | Single URL — video, user profile, or live room |
urls 📋 | array | — | Bulk list of URLs. Combined with url if both given. |
maxItems 📊 | integer | 100 | Max items per input URL (paginated modes). 1–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've confirmed your IP/cookie can pull Douyin no-watermark URLs. |
includeComments 💬 | boolean | false | Also fetch a batch of comments alongside video_detail |
cookie 🍪 | string (secret) | — | Browser cookie for private / gated content |
proxyConfiguration 🛡️ | object | RESIDENTIAL | Apify proxy settings — residential 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.
📤 Output
Unified schema across all platforms:
| Field | Description |
|---|---|
platform | tiktok, douyin, or bilibili |
item_type | video, user, comment, live, trending, or error |
item_id | Native platform 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 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 |
raw | Full source API response for advanced users |
scraped_at | ISO timestamp when scraped |
🧪 Examples
Single TikTok video with download URL
{"mode": "video_detail","url": "https://www.tiktok.com/@charlidamelio/video/7337889649290054955","downloadVideos": true}
Bulk — 3 creators' latest 50 posts each (Douyin)
{"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"}
💵 Pricing
Simple pay-per-event — you only pay for items successfully delivered:
| Event | Price | Covers |
|---|---|---|
| 🎬 Video scraped | $0.008 | Any video row (video_detail, user_posts, user_likes, live_info, trending) |
| 💬 Comment scraped | $0.002 | Each comment |
| 👤 Profile scraped | $0.005 | Each user profile |
Failed URLs return an error row and are not billed.
⚠️ Platform Quirks
The target platforms (TikTok, Douyin, Bilibili) frequently rotate their anti-bot defenses. 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 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 ~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 + URL still returned; download via your own client. |
| 🎵 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. |
We track these continuously and ship fixes as soon as they're available.
❓ FAQ
Q: Do I need a TikTok / Douyin / Bilibili account? No. The actor scrapes public data using the built-in Apify proxy. No login required.
Q: Do no-watermark MP4 URLs expire? Yes, TikTok and Douyin CDN URLs expire in a few hours. Download and store the file promptly.
Q: Can I scrape private accounts?
No — only public content is supported. For some gated endpoints (private collections, saved videos, TikTok comments), you may pass your browser cookie via the cookie field.
Q: TikTok comments mode returns 0 results?
TikTok's comment API 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.
Q: Will one URL appear in my output multiple times? No — each URL produces a single row (or a single error row).
Q: What happens if a URL is deleted or region-blocked?
You'll get an error row with item_type: "error" and a human-readable error_message. You are not charged for error rows.
Q: Can I run this with my own proxy instead of Apify proxy?
Yes — set custom proxy URLs in proxyConfiguration.proxyUrls.
Q: Does the actor handle bulk scraping efficiently? Yes — URLs are processed concurrently. 100 URLs typically finish in 2–3 minutes.
Q: What's the maximum URLs per run? There's no hard limit, but we recommend ≤ 500 URLs per run for optimal reliability. Split larger jobs into multiple runs for parallelism.
🆘 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 (e.g. 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.
🛡️ Legal
- Scrapes public data only.
- You are responsible for compliance with each platform's terms of service and your local laws (GDPR, CCPA, etc.).
- Personal data handling: store / transmit in line with applicable regulations.
⭐ Support
If something's not working, open the run → view the log → attach the run URL when reaching out. The actor auto-populates error rows with context, so paste those too.
Happy scraping. 🚀