TikTok Live Scraper — rooms, viewers, streams
Pricing
from $2.70 / 1,000 live rooms
TikTok Live Scraper — rooms, viewers, streams
Find live TikTok rooms by keyword with playable HLS/FLV/DASH stream links, check whether specific creators are live, or re-check a watchlist of rooms.
Pricing
from $2.70 / 1,000 live rooms
Rating
0.0
(0)
Developer
Mu0i
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
TikTok Live Scraper — rooms, viewers, streams
Find live TikTok rooms by keyword and get playable stream links — HLS, FLV and DASH — plus the stream title, viewer count and host. Or check whether specific creators are live right now. Or re-check a watchlist of rooms in a single request.
No login, no cookies, no browser.
The stream links are real, and they are checked
Each room comes with its full quality ladder. The links are fetched and verified, not just passed along:
recommendedHlsUrl | returns 200 application/x-mpegURL and a real #EXTM3U playlist — paste it into a browser player, ffmpeg or VLC |
flvOriginUrl | returns 200 video/x-flv with real FLV magic bytes — this is what TikTok's own app pulls |
dash | returns 200 application/dash+xml, a real MPD |
flvAudioOnlyUrl | audio-only pull, for transcription or monitoring without the video bandwidth |
Why recommendedHlsUrl exists rather than just handing you the ladder. TikTok's HLS origin quality
returns 404 — reproducibly, on every room tested — while uhd_60, hd_60, hd, sd and ld all serve
properly. origin is exactly the key you would reach for first, so this Actor picks the best quality that
actually works and tells you which one it chose in recommendedHlsQuality.
Prefer HLS or DASH over FLV. The FLV pull is HEVC/H.265, which most players and every browser refuse. HLS and DASH are what will actually play. When a room has no HLS the row says so and points you at the FLV links.
One page per keyword — a real limit, stated up front
TikTok's live search returns one page. Any offset above zero returns an empty list, while the response still
reports has_more: 1 and advances its own cursor — so it looks like working pagination and is not. The ceiling
is therefore 30 rooms per keyword; use more keywords for more rooms.
The input schema caps maxRoomsPerKeyword at 30 rather than accepting a number it cannot honour.
How to use
- Click Try for free at the top of this page. Apify creates a free account if you do not have one — no card is needed to run this.
- Put what you want scraped into Keywords — one per line.
- Set Max rooms per keyword to bound the run, then press Start. You are billed per row, so this field is also your budget.
- Rows show up in the Dataset tab while the run is still going. Export to JSON, CSV, Excel or XML from there, or read them over the API.
Live rooms end. Rows carry expiresAt for the stream links, and re-checking a list of roomIds later is the cheap way to poll.
Three ways in, combinable in one run
Every field, with its default — paste the whole block and delete what you do not need:
{"keywords": ["gaming"],"maxRoomsPerKeyword": 20,"creators": [],"roomIds": [],"streamFormats": ["hls","flv"]}
| input | what it gives you |
|---|---|
keywords | up to 30 live rooms each, with stream links, titles and viewer counts |
creators | one row per creator: are they streaming, and in which room. Handles, URLs or numeric IDs |
roomIds | one request re-checks the whole list — the cheap way to poll rooms from an earlier run |
maxRoomsPerKeyword | caps each keyword's search. Default 30, which is also as deep as one page goes |
streamFormats | which stream links to include. Default HLS + FLV |
On streamFormats: HLS (.m3u8) plays in browsers and in ffmpeg or VLC and is the one to keep if you
only keep one. FLV is what TikTok's own app pulls, and it is HEVC — many players cannot decode it.
DASH (.mpd) is the browser-native alternative to HLS and is off by default.
Stream links come only from keyword search. A creator check tells you they are live and gives you the room ID; the row says so plainly rather than leaving you to wonder where the links went.
Output
Every row carries source (search, creator or roomCheck) so mixed runs stay readable.
| field | |
|---|---|
roomId, title, viewers, isLive | |
ownerUsername, ownerNickname, ownerId, ownerSecUid, profileUrl, liveUrl | |
qualities[] | every quality the room offers |
recommendedHlsUrl, recommendedHlsQuality | the HLS link that works |
hls, flv, dash | the full ladders, per format you asked for |
flvOriginUrl, flvAudioOnlyUrl | |
expiresAt | when the link signatures lapse |
keyword, note | which term found it, and anything worth knowing |
One row, exactly as it lands in your dataset (long signed CDN links shortened here for readability):
{"source": "search","keyword": "music","roomId": "7673903898944375566","title": "FEEL GOOD FRI DJ LIVE","viewers": 138,"isLive": true,"ownerUsername": "thelovelythicki","ownerNickname": "♡ THiCKiANA ♡","ownerId": "6532034235442692097","ownerSecUid": "MS4wLjABAAAAdy_TEP2jMKBhoIIEmVTqd5d9-fNXvL7D7ZMpBLl_IGPgXAY4qqb90yn5rm09-hIW","profileUrl": "https://www.tiktok.com/@thelovelythicki","liveUrl": "https://www.tiktok.com/@thelovelythicki/live","qualities": ["uhd","hd","origin","…"],"recommendedHlsUrl": "https://pull-hls-f16-tt01.tiktokcdn-us.com/game/stream-357866927008619…?…","recommendedHlsQuality": "hd","expiresAt": "2026-08-28T19:31:54.000Z","note": "hls.origin returns 404 on every room measured — use recommendedHlsUrl","hls": {"uhd": "https://pull-hls-f16-tt01.tiktokcdn-us.com/game/stream-357866927008619…?…","hd": "https://pull-hls-f16-tt01.tiktokcdn-us.com/game/stream-357866927008619…?…","origin": "https://pull-hls-f16-tt01.tiktokcdn-us.com/game/stream-357866927008619…?…","sd": "https://pull-hls-f16-tt01.tiktokcdn-us.com/game/stream-357866927008619…?…","ld": "https://pull-hls-f16-tt01.tiktokcdn-us.com/game/stream-357866927008619…?…"},"flv": {"uhd": "https://pull-f5-tt01.tiktokcdn-us.com/game/stream-3578669270086190012_…?…","hd": "https://pull-f5-tt01.tiktokcdn-us.com/game/stream-3578669270086190012_…?…","origin": "https://pull-f5-tt01.tiktokcdn-us.com/game/stream-3578669270086190012.…?…","sd": "https://pull-f5-tt01.tiktokcdn-us.com/game/stream-3578669270086190012_…?…","ld": "https://pull-f5-tt01.tiktokcdn-us.com/game/stream-3578669270086190012_…?…","ao": "https://pull-f5-tt01.tiktokcdn-us.com/game/stream-3578669270086190012.…?…"},"flvOriginUrl": "https://pull-f5-tt01.tiktokcdn-us.com/game/stream-3578669270086190012.…?…","flvAudioOnlyUrl": "https://pull-f5-tt01.tiktokcdn-us.com/game/stream-3578669270086190012.…?…"}
Notes
- Links are session tokens, not permalinks. The signature lasts around two weeks, but a live room ends long before that — treat a link as good for this stream only, and re-run to find what is live now.
- You get links; the stream itself is pulled directly from TikTok's CDN by your own player or downloader.
- Chat, gifts and anything interactive genuinely need an account and are not available here. Watching does not.
- Rooms are region-dependent: these are what a US viewer sees.
- Only public data. There is no login, so nothing hidden from a logged-out visitor is reachable.
Run it from your own code
Every Actor is an API endpoint. This starts a run, waits for it, and returns the rows in one call — swap in your token from Settings → Integrations:
curl -X POST 'https://api.apify.com/v2/acts/mu0i~tiktok-live-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN' \-H 'Content-Type: application/json' \-d '{"keywords": ["gaming"],"maxRoomsPerKeyword": 20,"creators": [],"roomIds": [],"streamFormats": ["hls","flv"]}'
Pricing
Pay per result — you are billed for rows you receive, not for time or compute.
| Event | Per 1,000 | What one unit is |
|---|---|---|
room | $6.00 | one live room in the dataset |
Paid Apify plans pay less than this. The table above is the free-plan rate. Starter, Scale and Business each get a lower per-unit price — up to 55% off on Business — and the Actor's Pricing tab shows every tier before you run anything.
Starting a run costs $0.00001 — a cent per thousand runs — and there is no run minimum. You are never billed for a run that found nothing. If an input has nothing to collect the run says so in a row of the dataset — never a silently empty result, and never a charge. A run that fails because the data could not be reached fails loudly, because that one is worth retrying.
Related Actors
Fourteen Actors covering the whole public TikTok surface. Same billing rules and the same guarantees throughout: billed once for each row you receive, never billed for a run that found nothing, and told in the dataset why it found nothing.
| Actor | What it does |
|---|---|
| TikTok Search Scraper — videos, users, hashtags | Keyword search across every tab, deduplicated. |
| TikTok Hashtag Scraper — videos by hashtag | Every video under a hashtag, walked deep. |
| TikTok Trending Scraper — the real Explore feed | The app's real Explore feed, not Creative Center. |
| TikTok Profile Scraper — followers, likes, bio | Followers, likes, bio for any public account. |
| TikTok User Posts Scraper — every video + stats | Every video an account posted, with stats. |
| TikTok Comments Scraper — replies, no duplicates | Every comment and reply, no duplicate pages. |
| TikTok Video Downloader — no watermark MP4/MP3 | No-watermark MP4, MP3, covers and subtitles. |
| TikTok Transcript Scraper — no AI, no waiting | Subtitles from TikTok's own caption track. |
| TikTok Sound Scraper — videos using a sound | Videos that actually use a sound, filtered. |
| TikTok Places Scraper — locations and reviews | Locations with addresses, coordinates and reviews. |
| TikTok Shop Scraper — Products, Sellers & Reviews | Shop search, product detail, seller catalogue. |
| TikTok Shop Category Scraper — every product | Every product in a Shop category and its subcategories. |
| TikTok Shop Reviews Scraper — full archive | The full review archive for a Shop product. |