TikTok, Douyin & Bilibili Scraper โ€” Videos, Profiles, Comments avatar

TikTok, Douyin & Bilibili Scraper โ€” Videos, Profiles, Comments

Pricing

from $1.00 / 1,000 video scrapeds

Go to Apify Store
TikTok, Douyin & Bilibili Scraper โ€” Videos, Profiles, Comments

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

Pika Choo

Maintained by Community

Actor stats

6

Bookmarked

170

Total users

12

Monthly active users

4.4 hours

Issues response

20 minutes ago

Last modified

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.com URLs are followed to their canonical video URL before scraping; Bilibili b23.tv links are resolved too
  • ๐Ÿ›Ÿ Crash-proof: every failure mode (bad input, anti-bot, unsupported combo, network timeout) becomes a structured error row, never a failed run

๐Ÿ“ค What you get

Every row uses the same unified schema, whichever platform it came from:

FieldDescription
platformtiktok, douyin, or bilibili
item_typevideo, user, comment, live, trending, or error
item_idNative platform ID (aweme_id, BV-id, comment_id, sec_user_id)
urlCanonical URL back to the source
title, descriptionCaption / title text
author_id, author_name, author_usernameCreator info
duration_sec, cover_url, video_url_nowmVideo asset fields
music_title, music_authorBackground audio
hashtagsArray extracted from the caption
created_atISO publish timestamp
play_count, like_count, comment_count, share_count, collect_countEngagement stats
follower_count, following_count, video_count, bio, avatar_url, verifiedProfile fields
comment_id, reply_to_id, comment_textComment fields
live_status, live_title, viewer_countLive fields
modeMode that produced the record
error_message, attemptsPopulated on error rows only
rawFull source API response for advanced users
scraped_atISO 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

FieldTypeDescription
mode ๐ŸŽฌstringWhat to scrape. See the mode table below.

One of url or urls is also required (except for trending mode).

๐Ÿ“‹ Main fields

FieldTypeDefaultDescription
platform ๐ŸŒselectautoauto, tiktok, douyin, or bilibili
url ๐Ÿ”—stringnoneSingle URL: video, user profile, or live room
urls ๐Ÿ“‹arraynoneBulk list of URLs. Combined with url if both are given.
maxItems ๐Ÿ“Šinteger100Max items per input URL (paginated modes). 1 to 5000.

๐ŸŽ›๏ธ Options

FieldTypeDefaultDescription
downloadVideos โฌ‡๏ธbooleantrueInclude 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 ๐Ÿ”“booleanfalseOverride the Douyin auto-disable above. Use only if you have confirmed your IP or cookie can pull Douyin no-watermark URLs.
includeComments ๐Ÿ’ฌbooleanfalseAlso fetch a batch of comments alongside video_detail
cookie ๐Ÿชstring (secret)noneBrowser cookie for private or gated content
proxyConfiguration ๐Ÿ›ก๏ธobjectRESIDENTIALApify proxy settings. Residential is strongly recommended.

๐ŸŽฌ Modes ร— Platforms

ModeTikTokDouyinBilibiliInput 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
}
{
"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:

EventPriceCovers
๐ŸŽฌ Video scraped$0.001Any video row (video_detail, user_posts, user_likes, live_info, trending)
๐Ÿ’ฌ Comment scraped$0.001Each comment
๐Ÿ‘ค Profile scraped$0.001Each 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:

AreaBehaviorWhat to do
๐ŸŽถ Douyin no-watermark MP4 URLsDouyin's CDN currently rate-limits these to 403Auto-disabled by default. Metadata still returned. Pass forceDownload: true to attempt anyway.
๐Ÿ“… Douyin user_posts freshnessDouyin's public feed lags by roughly 6 days for some accountsUse Bilibili or TikTok for time-sensitive monitoring.
๐Ÿ“บ Bilibili download URLsBilibili rotates download tokens; some downloads may failMetadata and URL are still returned; download with your own client promptly.
๐ŸŽต Newer Douyin URL formatsSome short-form Douyin URL shapes are not yet parsedUse the canonical douyin.com/video/<id> form.
๐Ÿ‘ค TikTok user_profileSome regions return a soft block for profile lookupsTry a residential proxy in a different country group.
๐Ÿ’ฌ TikTok video_commentsTikTok's comment endpoint requires a logged-in sessionPaste 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.

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 ApifyClient
client = 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.


  • 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.