TikTok Discover Scraper: Live Stream Finder avatar

TikTok Discover Scraper: Live Stream Finder

Pricing

from $3.99 / 1,000 results

Go to Apify Store
TikTok Discover Scraper: Live Stream Finder

TikTok Discover Scraper: Live Stream Finder

TikTok Discover Scraper — Find TikTok LIVE streams through Discover and extract stream titles, creators, viewer counts, likes, categories, timestamps, and profile details. Discover trending live content, monitor creators, and analyze real-time audience engagement.

Pricing

from $3.99 / 1,000 results

Rating

0.0

(0)

Developer

Scrapio

Scrapio

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

0

Monthly active users

a day ago

Last modified

Share

TikTok Live Scraper — Extract Live Rooms, Streamers and Videos

Type a topic and get every TikTok LIVE room broadcasting on it right now — stream title, current viewer count, streamer handle and follower count, bio, category, start time and a clickable room URL — as typed JSON, no HTML to parse. No TikTok account, cookie or login is used anywhere in the run. Unlike scraping frameworks that hand back raw HTML you then have to parse, TikTok Live Stream Finder returns a stable JSON row per room, ready for a database, a spreadsheet, or an LLM context window without any cleanup. This guide covers every input and output field, how the run actually behaves against TikTok's anti-bot layer, and how teams put a real-time live-room feed to work.


🧭 What does TikTok Live Scraper do?

TikTok Live Scraper takes one or more topics — a plain word, a hashtag, a handle, or a TikTok search URL — and queries TikTok's logged-out LIVE search tab for each one. It returns one row per room that is actually on air at the moment the run executes, plus, optionally, the matching recorded videos for the same topic in the same run. No TikTok account, session cookie, or API key is required or used anywhere in the code — every surface it calls is public and logged-out.

  • 🔴 Discovers TikTok LIVE rooms broadcasting right now, by topic, hashtag, handle text or search URL
  • 👀 Returns the room's current concurrent viewer count at the instant of the scrape
  • 👤 Returns the streamer's handle, display name, follower/following counts and bio text
  • 🗂️ Returns the live room's category label plus its share and comment counts
  • 🎬 Optionally returns the matching recorded-video feed for the same topic, with the full video/author/music field set
  • 🌐 Runs with no proxy by default and escalates to Apify Proxy only if TikTok pushes back
  • 🔓 Fully logged out — nothing to authenticate, nothing to rotate, nothing that expires mid-run

⚡ Features & Capabilities

TikTok Live Scraper is built around one real-time surface (TikTok's LIVE search) and one optional supporting surface (TikTok's general video search), each reached through a different transport because TikTok gates them differently.

Core features

  • Keyword-to-live-room discovery. Every input line is normalized into a search term — a plain topic, a #hashtag with the # stripped, an @handle with the @ stripped and searched as text, or a TikTok search URL (?q=, ?keyword=, ?query=, or a /tag/, /discover/, /search/, /music/, /live/ path segment).
  • Full room + streamer field set per row, nested under liveRoom: roomId, title, status, isLive, currentViewers, startedAt / startedAtISO, streamerUsername, streamerNickname, streamerUserId, streamerSecUid, streamerFollowers, streamerFollowing, streamerBio, categoryName, shareCount, commentCount, coverUrl, roomUrl.
  • Optional recorded-video context for the same topic, carrying the full base video contract: id, text, createTime / createTimeISO, authorMeta.*, musicMeta.*, videoMeta.*, diggCount, shareCount, playCount, collectCount, commentCount, mentions, hashtags, effectStickers.
  • Cost gates applied before the charge, not after. minLiveViewers and maxLiveRoomsPerTerm drop rows before Actor.push_data() is ever called, so a filtered-out room is never charged.
  • Body-shape blocking detection, not status-code detection. Every dead TikTok surface answers HTTP 200, so a soft block is detected from response body size and shape (a ~1,462-byte WAF challenge page, or a small JSON refusal payload), never from the HTTP status.
  • Two independent dataset views ship with the actor: 🔴 Live rooms on air (the default view, room-focused) and 🎬 Recorded video rows (the optional video-context view).

How TikTok Live Scraper compares to other TikTok scrapers

FeatureTikTok Live Scraper (this Actor)Geographic Live Streamers (mcdowell)Live Status Monitor (unseenuser)
Discovery inputFree-text topic, hashtag, handle, or search URLFixed region dropdown (location)Known creator handles only
Login requiredNoNot documented on their listingNo
Live-room fieldsTitle, viewer count, category, share/comment counts, room URL, streamer bioAccount, bio, followers, engagement, region/languageis_live flag, room title, viewer/enter counts, playback URLs (FLV/HLS/CMAF)
Recorded-video context in the same runYes, optionalNot documentedNot offered — the listing states it is a status checker, not a recorder
Proxy handlingAutomatic none → datacenter → residential escalation on soft-block detectionResidential proxy required by the actor, per their listingNot documented
Pricing modelPay per event ($0.005 per dataset row)Flat monthly price, per their listingPay per event, per their listing

Competitor columns reflect each Actor's own public Apify Store listing, checked against the 2026-07-08 Store snapshot. Neither competitor publishes a comparable field-level coverage table, so no cross-Actor accuracy claim is made here.

If your use case is feeding structured data to an LLM or an agent, the "output format" and "field set" rows above are the decision-maker — parsing HTML or a raw stream inside an agent loop is a reliability failure mode, not a feature.

When another tool might suit you better

If you already know the exact creator handles you want to track — not a topic — and you need ready-to-play FLV/HLS/CMAF stream URLs to pipe into a video player, a handle-based checker such as unseenuser's TikTok Live Status Monitor (as observed on its Apify listing, checked 2026-07-08) is the better fit: it is built to poll a fixed roster of handles and hand back playback URLs directly. This Actor's model is discovery-by-topic — it does not accept a handle list as its primary input, and it does not return playback stream URLs. Use it when the starting point is a topic, hashtag, or search term rather than a known roster of accounts.

TikTok Live Scraper within the Scrapio data stack

TikTok Live Scraper covers live rooms and their broadcasters, discovered by topic. For a creator's posted-video history plus TikTok's own suggested search terms per video, use TikTok Profile Videos API Scraper & Search Keywords. For a hashtag's sound commercial-use and copyright flags, use TikTok Hashtag Scraper: Music Rights & Streaming Links. For country-level trending-feed videos, use TikTok Trending Videos Scraper Plus.


Why do developers and data teams scrape TikTok LIVE?

Live broadcast data behaves nothing like a video catalogue — it is only true for the seconds it is captured — which pulls in a distinct set of audiences.

🏢 Live-commerce and creator marketing teams

A brand or agency scouting streamers for a sponsorship enters candidate topics (a product category, a niche, a competitor's name) and gets back every room currently broadcasting on it, ranked by liveRoom.currentViewers and liveRoom.streamerFollowers. liveRoom.streamerBio lets a scout qualify a candidate's niche and tone without opening a profile page separately, and liveRoom.roomUrl is a direct, clickable link to join and evaluate the room live. The output lands in a dataset export (CSV, JSON, Excel, or XML) or straight into a spreadsheet via the Apify API for the team running outreach.

📊 AI training data and RAG indexing

liveRoom.streamerBio and liveRoom.title are this Actor's highest-information free-text fields — bio text describes the creator's niche and voice in their own words, and the title states what the broadcast is about at that moment. For RAG, those two fields plus liveRoom.categoryName are the fields worth embedding, since they are the only ones carrying unstructured natural language. For training data, currentViewers, streamerFollowers, streamerFollowing, shareCount and commentCount return as typed integers (or null when TikTok did not send a value) with a stable schema across every run, so no type coercion or string parsing is needed before loading them into a feature table.

📱 Competitive and market intelligence

Track how many live rooms a category is running for a given topic at different times of day, and compare that count against a competitor's own hashtag or brand name run as a separate topic. liveRoom.currentViewers and liveRoom.startedAtISO, captured across scheduled runs, show when a niche's live activity actually peaks — useful for timing your own broadcast rather than guessing.

🔬 Research and academic use

Public live-streaming behaviour — how many creators are broadcasting on a topic, what audience sizes they draw, and when — is a dataset public-data researchers can build without needing platform API access. This Actor only ever returns what TikTok's own logged-out LIVE search tab already shows to any visitor; it collects no private data, no direct messages, and nothing behind a login wall.

🎥 Product and SaaS development

A "who's live right now" widget, a live-room directory, or a creator-monitoring dashboard can all be built on scheduled runs of this Actor feeding a database keyed on liveRoom.roomId. Because the field set is stable and null-safe (missing values are null, never a faked zero), a downstream product does not need defensive parsing around every field.


🍚 Input Parameters

All six input parameters, read directly from the Actor's input schema, in schema order:

ParameterRequiredTypeDescriptionExample Value
startUrlsYesarray of stringsOne topic per line. Accepts a plain topic (gaming), a hashtag (#fitness, # stripped), a handle (@charlidamelio, @ stripped and searched as text), or a TikTok search URL. Broad topics return the most rooms; TikTok serves 1–16 live rooms per term on a single page.["gaming", "chat", "https://www.tiktok.com/search/live?q=makeup"]
liveOnlyNobooleanOn — only rooms broadcasting right now; no browser is launched for the LIVE pass itself, so this is the fastest and cheapest mode. Off (default false) — you also get the matching recorded videos for each topic, so the dataset carries the full video field set as well.false
minLiveViewersNointegerDrops rooms with fewer than this many people watching at the moment of the scrape, before the row is pushed or charged. 0 (default) keeps everything. Minimum 0, maximum 1000000. Per the schema's own field description, viewer counts observed across a sample of 50 rooms ranged from 5 to 8,837.100
maxLiveRoomsPerTermNointegerHard cap on live rows kept per topic, so a busy term cannot surprise you on cost. Minimum 1, maximum 50, default 25. The LIVE surface returns a single page per topic, so in practice a topic yields 1–16 rooms and this cap only binds when set low.25
maxItemsNointegerHow many recorded videos to collect per topic alongside the live rooms. Ignored entirely when liveOnly is on. 0 means unlimited within platform limits (the run treats 0 as the schema maximum, 500). Minimum 0, maximum 500, default 10.10
proxyConfigurationNoobject (Apify Proxy editor)Optional. The run starts with no proxy, then escalates to datacenter and residential automatically only if TikTok pushes back. Open this only to pin a specific Apify Proxy group from the start — note that the live-room result set follows the exit IP's region.{"useApifyProxy": false}

Complete input example:

{
"startUrls": ["gaming", "chat", "https://www.tiktok.com/search/live?q=makeup"],
"liveOnly": false,
"minLiveViewers": 100,
"maxLiveRoomsPerTerm": 25,
"maxItems": 10,
"proxyConfiguration": { "useApifyProxy": false }
}

Supported URL types and input formats

startUrls accepts four distinct line formats, all normalized to the same internal search term before the request is made:

  1. A plain topic or categorygaming, makeup, real estate. Searched exactly as typed.
  2. A hashtag#fitness. The leading # is stripped before the search, so #fitness and fitness produce the identical query.
  3. A handle@charlidamelio. The leading @ is stripped and the remainder is searched as plain text on the LIVE tab — it is not resolved into that account's profile or restricted to that creator's own room.
  4. A TikTok search URLhttps://www.tiktok.com/search/live?q=cooking. The q= (or keyword= / query=) value is extracted and used as the search term; a URL with a /tag/, /discover/, /search/, /music/ or /live/ path segment has that segment's value extracted the same way.

Duplicate terms (after normalization) are collapsed to one entry, so gaming, #gaming and https://www.tiktok.com/search/live?q=gaming on separate lines run as a single search, not three.


📦 Output Format

Each run produces one flat JSON row per result in the dataset, with a rowType of either "liveRoom" or "video". Every row — of either type — shares the identical base field set; whichever half does not apply to that row (the base video contract on a live row, or liveRoom on a video row) is set to null rather than a placeholder or a faked zero. Every pushed row is charged once through the row_result event at $0.005 per row; rows dropped by minLiveViewers or maxLiveRoomsPerTerm are filtered out before Actor.push_data() is called and are never charged. Results export from the Dataset tab as JSON, CSV, Excel, XML, HTML table or RSS, or are pulled through the Apify API / apify-client.

Output for a live room

{
"rowType": "liveRoom",
"hashtag": "gaming",
"count": 1,
"id": null,
"text": null,
"createTime": null,
"createTimeISO": null,
"isAd": null,
"isMuted": null,
"authorMeta": {
"id": null, "name": null, "nickName": null, "verified": null,
"signature": null, "bioLink": null, "avatar": null, "privateAccount": null,
"following": null, "fans": null, "heart": null, "video": null, "digg": null
},
"musicMeta": {
"musicName": null, "musicAuthor": null, "musicOriginal": null,
"musicAlbum": null, "playUrl": null, "coverMediumUrl": null, "musicId": null
},
"webVideoUrl": null,
"mediaUrls": [],
"videoMeta": {
"height": null, "width": null, "duration": null, "coverUrl": null,
"originalCoverUrl": null, "definition": null, "format": null,
"originalDownloadAddr": null, "downloadAddr": null,
"subtitleUrls": [], "slideshowImages": []
},
"diggCount": null,
"shareCount": null,
"playCount": null,
"collectCount": null,
"commentCount": null,
"mentions": [],
"hashtags": [],
"effectStickers": [],
"isSlideshow": null,
"isPinned": null,
"input": "gaming",
"discoveryInfo": {
"breadcrumbs": [],
"relatedTags": [],
"url": "https://www.tiktok.com/search/live?q=gaming",
"tag": "gaming",
"type": "search_live"
},
"liveRoom": {
"roomId": "7532001122334455667",
"title": "late night ranked grind",
"status": 2,
"isLive": true,
"currentViewers": 1483,
"startedAt": 1753800000,
"startedAtISO": "2026-07-29T14:40:00Z",
"streamerUsername": "somestreamer",
"streamerNickname": "Some Streamer",
"streamerUserId": "6789012345678901234",
"streamerSecUid": "MS4wLjABAAAAexample",
"streamerFollowers": 240311,
"streamerFollowing": 118,
"streamerBio": "daily streams 8pm CET",
"categoryName": "Gaming",
"shareCount": 42,
"commentCount": 903,
"coverUrl": "https://p16-webcast.tiktokcdn.com/img/room-cover-example~tplv-obj.image",
"roomUrl": "https://www.tiktok.com/@somestreamer/live"
},
"scrapedAt": "2026-07-29T14:52:11Z"
}

Output for a recorded video

{
"rowType": "video",
"hashtag": "gaming",
"count": 2,
"id": "7321098765432109876",
"text": "when the clutch actually works #gaming #fyp",
"createTime": 1721654321,
"createTimeISO": "2024-07-22T09:12:01Z",
"isAd": false,
"isMuted": false,
"authorMeta": {
"id": "6543210987654321098", "name": "gamerhandle", "nickName": "Gamer Handle",
"verified": false, "signature": "clips daily", "bioLink": null,
"avatar": "https://p16-sign-va.tiktokcdn.com/avatar-example~c5_100x100.jpeg",
"privateAccount": false, "following": 210, "fans": 88450, "heart": 2140233,
"video": 512, "digg": 3301
},
"musicMeta": {
"musicName": "original sound", "musicAuthor": "gamerhandle", "musicOriginal": true,
"musicAlbum": "", "playUrl": "https://sf16-ies-music.tiktokcdn.com/example.mp3",
"coverMediumUrl": "https://p16-sign-va.tiktokcdn.com/music-cover-example.jpeg",
"musicId": "7321098765432109000"
},
"webVideoUrl": "https://www.tiktok.com/@gamerhandle/video/7321098765432109876",
"mediaUrls": ["https://v16-webapp.tiktok.com/example-playaddr/"],
"videoMeta": {
"height": 1024, "width": 576, "duration": 18,
"coverUrl": "https://p16-sign-va.tiktokcdn.com/cover-example.jpeg",
"originalCoverUrl": "https://p16-sign-va.tiktokcdn.com/origin-cover-example.jpeg",
"definition": "540p", "format": "mp4",
"originalDownloadAddr": "https://v16-webapp.tiktok.com/example-downloadaddr/",
"downloadAddr": "https://v16-webapp.tiktok.com/example-downloadaddr/",
"subtitleUrls": [], "slideshowImages": []
},
"diggCount": 15230,
"shareCount": 240,
"playCount": 402110,
"collectCount": 890,
"commentCount": 331,
"mentions": [],
"hashtags": [
{"id": "112233", "name": "gaming", "title": "", "cover": ""}
],
"effectStickers": [],
"isSlideshow": false,
"isPinned": false,
"input": "gaming",
"discoveryInfo": {
"breadcrumbs": [],
"relatedTags": [],
"url": "https://www.tiktok.com/search?q=gaming",
"tag": "gaming",
"type": "search_general"
},
"liveRoom": null,
"scrapedAt": "2026-07-29T14:53:41Z"
}

Schema stability and export options

Field names are fixed by this Actor's own row builders, not copied verbatim from TikTok's internal payload keys — so if TikTok renames an internal field on its end, the Actor's output key stays the same and only the mapping underneath is updated. A field TikTok does not send for a given row is always null, never a faked 0 or an empty string standing in for "unknown" — liveRoom.streamerBio, liveRoom.categoryName, liveRoom.shareCount and liveRoom.commentCount in particular are not sent on every room. Two dataset table views ship by default — 🔴 Live rooms on air and 🎬 Recorded video rows — and the underlying dataset is exportable as JSON, CSV, Excel (XLSX), XML, HTML table or RSS from the Apify Console, or fetched programmatically through the Apify API and apify-client.


💡 TikTok Live Scraper Strategy Guide

🎯 Strategy 1: Real-time enrichment pipeline

Feed in a list of brand-relevant topics (a product category, a client's own name, a competitor's name) and run the Actor on a trigger — a new lead form submission, a CRM update, or a manual kickoff. Append liveRoom.currentViewers, liveRoom.streamerFollowers and liveRoom.streamerBio to the matching record in your CRM or spreadsheet via the Apify API, then write the enriched record back to the destination system. This turns "is anyone live on this topic right now" into a field on an existing record instead of a manual check.

🎯 Strategy 2: Scheduled monitoring and alerting

Use an Apify Schedule to run the Actor on a topic list every few minutes. Keep the previous run's rows (keyed on liveRoom.roomId) in any key-value store, and diff the current run against it on liveRoom.isLive and liveRoom.currentViewers. Alert — via an Apify webhook on RUN.SUCCEEDED piped to Slack, email, or a custom endpoint — the moment a roomId you have not seen appears, or when currentViewers on a tracked room crosses a threshold you define.

🎯 Strategy 3: Bulk dataset build

Pass a large topic list (industries, hashtags, competitor names) into a single run, or split it across parallel runs kicked off through the Apify API, one per topic group. Aggregate each run's dataset export (CSV or JSON) into a warehouse or research database keyed on hashtag and scrapedAt. Because minLiveViewers and maxLiveRoomsPerTerm are cost gates applied before the row is charged, a bulk build across many topics stays predictable on row_result charges even when a handful of topics spike in room count.

Strategy comparison at a glance

StrategyBest forRun patternOutput format
Real-time enrichmentScoring or qualifying a lead/creator the moment a workflow needs itSingle triggered run per eventJSON row appended to a CRM/spreadsheet record
Scheduled monitoringCatching a topic or room going live without manual pollingApify Schedule + webhook on RUN.SUCCEEDEDDiffed dataset rows, alert on transition
Bulk dataset buildResearch or market-mapping across many topics at onceOne large run or several parallel runsAggregated CSV/JSON export

TikTok Live Scraper covers one entity type — live rooms discovered by topic, with optional video context. For adjacent TikTok data, these other Scrapio Actors cover the entity types this one does not:

Scraper NameWhat it extracts
TikTok Profile Videos API Scraper & Search KeywordsA creator's posted-video history plus TikTok's own suggested search terms and content-category labels per video
TikTok Hashtag Scraper: Music Rights & Streaming LinksVideos for a hashtag, with each video's sound commercial-use flag, copyright flag, and Apple Music/Spotify links
TikTok Trending Videos Scraper PlusCountry- and period-filtered trending-feed videos, or specific video URLs, with derived engagement metrics

This account does not currently publish a comparable live-broadcast discovery Actor for another platform (Twitch, YouTube Live, Kick), so no cross-platform alternative is listed here.


How to integrate TikTok Live Scraper with your stack

TikTok Live Scraper works with any language or tool that can make an HTTP request — it is an Apify Actor reached through the Apify API, apify-client (Python), or apify-client (JavaScript).

Python

from apify_client import ApifyClient
import csv
client = ApifyClient("<YOUR_APIFY_TOKEN>")
topics = ["gaming", "chat", "makeup"]
rows = []
for topic in topics:
run = client.actor("tiktok-discover-scraper-live-stream-finder").call(run_input={
"startUrls": [topic],
"liveOnly": True,
"minLiveViewers": 50,
"maxLiveRoomsPerTerm": 25,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
room = item.get("liveRoom") or {}
rows.append({
"topic": topic,
"streamer": room.get("streamerUsername"),
"viewers": room.get("currentViewers"),
"followers": room.get("streamerFollowers"),
"title": room.get("title"),
"roomUrl": room.get("roomUrl"),
})
with open("live_rooms.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=rows[0].keys())
writer.writeheader()
writer.writerows(rows)
print(f"Wrote {len(rows)} live rooms to live_rooms.csv")

Node.js

const { ApifyClient } = require('apify-client');
const fs = require('fs');
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const topics = ['gaming', 'chat', 'makeup'];
const rows = [];
for (const topic of topics) {
const run = await client.actor('tiktok-discover-scraper-live-stream-finder').call({
startUrls: [topic],
liveOnly: true,
minLiveViewers: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const item of items) {
const room = item.liveRoom || {};
rows.push({ topic, streamer: room.streamerUsername, viewers: room.currentViewers });
}
}
fs.writeFileSync('live_rooms.json', JSON.stringify(rows, null, 2));
console.log(`Wrote ${rows.length} live rooms`);

Async and scheduled pipelines

For fire-and-forget or recurring jobs, use an Apify Schedule to run the Actor on a fixed cron interval without any client code running at all, and attach an Apify webhook on RUN.SUCCEEDED to notify your endpoint with the run's defaultDatasetId as soon as it finishes. For a one-off large topic list, start the run asynchronously through the API and poll the run status or dataset item count instead of blocking on .call().


🎯 Who Needs TikTok Live Scraper? (Use Cases & Industries)

🏢 Live-commerce and creator marketing teams

An agency scouting streamers for a sponsored live drop enters candidate product categories and pulls back every room broadcasting on them right now, sorted by liveRoom.currentViewers and liveRoom.streamerFollowers, with liveRoom.streamerBio used to confirm fit before reaching out.

📊 AI and data teams building RAG or training pipelines

Teams indexing creator and live-broadcast context for an LLM pull liveRoom.streamerBio, liveRoom.title and liveRoom.categoryName as the free-text fields, and the numeric engagement fields as stable, typed training features — no HTML parsing or string cleanup required before either use.

📱 Brand and market-intelligence analysts

Analysts tracking a competitor's live-commerce cadence run the competitor's brand name or product hashtag as a topic on a schedule, logging liveRoom.currentViewers and liveRoom.startedAtISO over time to chart when and how often that competitor goes live.

🔬 Researchers

Academic and social-platform researchers studying live-streaming behaviour on public data use topic-level room counts and viewer distributions without needing a TikTok developer account or private API access — every field returned here is already visible on TikTok's own public LIVE search tab.

🎥 Product builders and SaaS teams

Teams building a "who's live now" directory, a live-room alert bot, or a creator-monitoring dashboard schedule this Actor and store rows keyed on liveRoom.roomId, relying on the null-safe field set instead of writing defensive parsing for missing data.


Scraping publicly accessible data is generally lawful in the United States: in hiQ Labs, Inc. v. LinkedIn Corp., 9th Cir. 2019 (on remand, 2022), the court held that scraping data that is not behind a login wall does not violate the Computer Fraud and Abuse Act. That precedent concerns public-data access broadly, not TikTok specifically, so treat it as the general legal backdrop rather than a TikTok-specific ruling.

Separately, violating a platform's Terms of Service is a civil contract matter between the scraper and the platform, not a criminal one — it can expose an account or IP to enforcement action by TikTok, but that is a different question from the criminal-law question above.

This Actor's output includes personal data of individual TikTok creators — handles, display names, bios, and follower counts that are publicly visible on TikTok's own LIVE search tab. Collecting and storing that data can still trigger GDPR, CCPA, or equivalent data-protection obligations depending on your jurisdiction and use case, independent of whether the scraping itself is lawful.

TikTok Live Scraper returns only publicly accessible data. What you do with that data is your responsibility — consult legal counsel for commercial applications involving personal data.


❓ Frequently asked questions

Does TikTok Live Scraper work without a TikTok account?

Yes. Every surface the Actor calls — TikTok's LIVE search and general search — is reached logged out. No credential, cookie, key, or session constant exists anywhere in the code.

How does TikTok Live Scraper handle TikTok's anti-scraping measures?

It classifies every response by body size and shape rather than HTTP status, because a blocked TikTok surface still answers HTTP 200. On a detected soft block (a WAF challenge page or a small JSON refusal), it escalates through a proxy ladder — no proxy, then Apify datacenter proxy, then residential proxy — and retries with a fresh TLS impersonation profile. Once a row has been pushed for a given topic, the ladder stops retrying that topic rather than risk pushing (and charging for) a duplicate row.

Can I run TikTok Live Scraper at scale without getting blocked?

The Actor auto-escalates its own proxy tier when TikTok's WAF pushes back, and the recorded-video pass runs through a signed browser transport specifically because TikTok's general-search endpoint refuses plain HTTP clients outright. No uptime or success-rate figure is published for this behaviour, since none is measured or guaranteed.

How fresh is the data TikTok Live Scraper returns?

Live-room data is fetched fresh on every run — liveRoom.currentViewers, liveRoom.shareCount and liveRoom.commentCount are true only at the exact moment recorded in scrapedAt. Nothing is cached between runs; a room that had 1,483 viewers ten minutes ago may have a different count, or may no longer be live, on the next run.

Which TikTok fields work best for AI training and RAG indexing?

For RAG, embed liveRoom.streamerBio and liveRoom.title — the only free-text fields in a live-room row, describing the creator's niche and the broadcast's subject in their own words. For training data, currentViewers, streamerFollowers, streamerFollowing, shareCount and commentCount return as typed integers (or null when TikTok did not send a value) with a consistent structure across every row, requiring no normalization before loading.

Does scraping TikTok raise data protection concerns?

It can. The Actor returns publicly visible personal data — streamer handles, display names, bios, and follower counts — so GDPR, CCPA, or equivalent obligations may apply to how you store and use it, depending on your jurisdiction. Lawful basis for that storage and use sits with you, the operator of the run, not with the Actor.

Does TikTok Live Scraper work with Claude, ChatGPT, and other AI agent tools?

There is no dedicated MCP server built for this Actor. It is callable as a standard HTTP endpoint by any agent framework, through the Apify API or apify-client, and every row returns as typed JSON — no HTML or stream parsing needed before passing a result into an LLM context window.

Can I filter out tiny or near-empty streams?

Yes. Set minLiveViewers above 0 and rooms below that concurrent viewer count are dropped before the row is pushed, so you are not charged for rooms you did not want.

Why did my run return zero live rooms for a topic?

Because nothing was actually broadcasting on that topic at the moment the run executed — TikTok's LIVE search is a single-page, point-in-time surface with no deeper pagination, so an empty result for a narrow or off-hours topic is a valid, correct answer, not an error.

How does TikTok Live Scraper compare to other TikTok live-data scrapers?

Geographic Live Streamers (mcdowell) discovers streamers by a fixed region dropdown rather than a free-text topic, and requires a residential proxy per its own listing — it is the better tool if region, not topic, is your primary filter. TikTok Live Status Monitor (unseenuser) is a handle-based status checker that returns playback stream URLs, which is a better fit if you already have a roster of known handles and need direct FLV/HLS links rather than topic discovery. TikTok Live Scraper is built specifically for the "what's broadcasting on this topic right now" question, with an optional recorded-video companion feed neither competitor's listing documents.


ℹ️ Disclaimer

TikTok Live Scraper extracts only publicly available data from TikTok's logged-out LIVE and general search surfaces. This tool is intended for lawful use cases only. Users are responsible for complying with TikTok's Terms of Service and applicable data protection laws in their jurisdiction.