# TikTok Live Status Monitor - Stream URLs \[NO LOGIN] ✅ (`unseenuser/tiktok-live-status-scraper`) Actor

Check if any TikTok handle is currently live and get the stream playback URLs. Returns room ID, viewer count, stream quality URLs. NOT a recorder - status + URLs only. No login, no cookies. Built for brand alerts, creator monitoring, and live event tracking.

- **URL**: https://apify.com/unseenuser/tiktok-live-status-scraper.md
- **Developed by:** [Unseen User](https://apify.com/unseenuser) (community)
- **Categories:** Social media, Developer tools, Other
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 4 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

$5.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## TikTok Live Status Checker - Is User Live + Room Data + Stream URLs (No Login)

> #### Read this first
> **This is a STATUS CHECKER.** We tell you if a creator is live and return the stream URLs. **We do NOT record, download, transcribe, or archive the stream.** If a 1-star review starts with "I expected a recording", you skipped this paragraph. For recordings, use a downloader like agentx and see the [Comparison](#comparison-live-status-checker-vs-live-stream-downloaders) section.

Check if any TikTok creator is currently live streaming. Returns room title, start time, current viewer count, total enter count, creator profile data (nickname, follower count, avatar), room cover image, and multi-quality playback URLs (FLV, HLS, CMAF). Batch handle support, optimised to be polled on a schedule for monitoring workflows: alerts, dashboards, fan-engagement automation.

**No TikTok login required.** No browser session, no cookies, no MFA.

**Built for the keywords:** tiktok live status, tiktok live checker, is-user-live tiktok, tiktok live monitor, tiktok live alerts, creator monitoring, live stream tracker, tiktok live api, brand alerts tiktok.

### Table of contents

- [What this Actor is and is not](#what-this-actor-is-and-is-not)
- [Free plan limit](#free-plan-limit)
- [Hero use cases](#hero-use-cases)
- [Workflow example: 24/7 monitoring of 10 creators](#workflow-example-247-monitoring-of-10-creators-for-15month)
- [Sample output](#sample-output)
- [Inputs](#inputs)
- [Outputs](#outputs)
- [Integrations: Make, n8n, Zapier, webhook](#integrations)
- [Comparison vs live-stream downloaders](#comparison-live-status-checker-vs-live-stream-downloaders)
- [Use cases](#use-cases)
- [Quick start](#quick-start)
- [FAQ](#faq)
- [Related scrapers](#related-scrapers)

### What this Actor is and is not

| What it DOES | What it DOES NOT do |
|---|---|
| Tells you if a handle is live RIGHT NOW (`is_live: true / false`) | Record or download the stream |
| Returns the active room's title, start time, viewer counts | Provide replay or VOD URLs |
| Returns the creator's nickname, follower count, avatar | Generate transcripts or captions |
| Returns multi-quality playback URLs (FLV / HLS / CMAF, SD / HD / UHD) | Work for streams that have already ended |
| Supports batch handle checking in a single run | Bypass TikTok geo or commerce restrictions |
| Designed to be polled on a schedule for monitoring | Surveil specific individuals over time (see addendum) |

If a creator is offline, you get `is_live: false` and a clean null payload. If they are live, you get everything you need to either deep-link a viewer to the live room or pipe the playback URL into a player you already control.

### Free plan limit

Free Apify users get up to **50 results per run**. Paying users are not affected and receive results normally.

This limit was set by the Actor developer, not by Apify. To remove it and receive unlimited results, upgrade to any paid Apify plan: https://apify.com/pricing

When a free plan run hits the cap, the Actor finishes successfully (status `SUCCEEDED`) and the run's status message explains what happened. No error is raised, so the first 50 results are fully usable as normal.

### Hero use cases

Concrete, end-to-end workflows. Each one assumes you already have an Apify account and pick a handle list.

#### 1. Slack alert when your sponsored creator goes live

You paid a creator $5k to do a live during your product launch. You want your campaign manager to drop into the stream within 60 seconds of go-live to screenshot the brand mention.

````

Apify Schedule (every 5 min)
-> Run Actor with { handles: \[your 10 paid creators] }
-> Apify webhook (RUN.SUCCEEDED)
-> Your endpoint compares this run's is\_live to last run's is\_live per handle
-> On false -> true transition: POST to Slack incoming webhook

```

Result: a Slack message like

```

🔴 @just\_alex is LIVE: "Sunday launch - new merch live now"
1,342 viewers - 482k followers
Join: https://www.tiktok.com/@just\_alex/live

```

#### 2. Brand dashboard tracking competitor live events

You run social at a DTC skincare brand. Three competitors run weekly live-commerce drops. You want a Metabase chart of "competitor live frequency + peak concurrent viewers".

```

Apify Schedule (every 15 min)
-> Run Actor with { handles: \[50 competitor ambassadors] }
-> Apify webhook
-> Postgres INSERT (handle, fetched\_at, is\_live, viewer\_count, total\_enter\_count, room\_title)
-> Metabase chart on rolling 30-day window

```

You learn that Competitor A goes live every Tuesday at 8pm ET and peaks at 4k viewers. You schedule your own drop for Tuesday at 7:45pm ET.

#### 3. Fan-engagement bot for your favourite streamer

You run a 20k-member Telegram fan community for an esports streamer. Members want a ping the moment the streamer goes live.

```

Apify Schedule (every 2 min)
-> Run Actor with { handles: \["thestreamer"] }
-> Apify webhook
-> Lambda: if is\_live transitioned false -> true, send Telegram broadcast

```

Telegram message:

```

@thestreamer is LIVE - tap to join 🎮
"Ranked grind to Diamond - sub goal 500"
Watch: https://www.tiktok.com/@thestreamer/live

```

#### 4. Esports / gaming live monitor

200 esports pros, 6 verticals. Surface "currently live in CS2 / Valorant / Apex" on your community discovery page.

```

Apify Schedule (every 5 min)
-> Run Actor with { handles: \[200 pros, tagged by vertical] }
-> Apify webhook
-> Redis SET "live:cs2:\[handle]" with TTL 6 min on every is\_live: true row
-> Discovery page reads Redis keys, renders live grid

```

#### 5. Agency creator-watch tool

A talent agency manages 80 creators. The agency dashboard shows "who is live, what's the title, viewer count" as a real-time roster strip.

```

Apify Schedule (every 5 min)
-> Run Actor with { handles: \[80 roster handles] }
-> Webhook -> Firestore upsert per handle
-> Next.js app subscribes to Firestore, renders live cards

````

### Workflow example: 24/7 monitoring of 10 creators for ~$15/month

Full, copy-paste-able recipe.

**Step 1.** Open this Actor's page on Apify, click **Schedules > Create new schedule**.

**Step 2.** Set the cron to `*/5 * * * *` (every 5 minutes). 12 runs/hour × 24h × 30 days = 8,640 runs/month. Each run is a single tiny HTTP request per handle.

**Step 3.** In the schedule's **Actor input**, paste:

```json
{
    "handles": [
        "creator01", "creator02", "creator03", "creator04", "creator05",
        "creator06", "creator07", "creator08", "creator09", "creator10"
    ],
    "include_stream_urls": true
}
````

**Step 4.** Attach an **integration**: under **Integrations > Add webhook**, set event type to `RUN.SUCCEEDED` and URL to your endpoint. The webhook payload includes the run's `defaultDatasetId`, which you fetch:

```
GET https://api.apify.com/v2/datasets/{defaultDatasetId}/items?token={APIFY_TOKEN}
```

**Step 5.** Detect transitions. Keep last state per handle in any KV store (Redis, DynamoDB, even a JSON file). Pseudocode:

```js
for (const row of dataset) {
    const wasLive = await store.get(`live:${row.handle}`) === 'true';
    const isLive = row.is_live === true;
    await store.set(`live:${row.handle}`, String(isLive));

    if (!wasLive && isLive) {
        await fetch(SLACK_WEBHOOK_URL, {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({
                text:
                    `🔴 @${row.handle} is LIVE: "${row.liveRoom.title}"\n` +
                    `${row.liveRoom.viewer_count} viewers - ` +
                    `${row.liveRoomUserInfo.followerCount} followers\n` +
                    `https://www.tiktok.com/@${row.handle}/live`,
            }),
        });
    }
}
```

**Estimated cost:** roughly **~$15/month** of Apify compute for 24/7 polling of 10 creators on a 5-minute cadence on a typical paid plan. Scales linearly: 100 creators ~ $150/mo, 1 creator ~ $1.50/mo. Exact pricing is shown on this Actor's Apify page; cheaper if you can poll less often (15-minute cadence cuts it to ~$5/mo for 10 creators).

### Sample output

When the creator is live (`is_live: true`), each row in the dataset looks like:

```json
{
    "handle": "thejustalex",
    "is_live": true,
    "liveRoomUserInfo": {
        "nickname": "Just Alex",
        "uniqueId": "thejustalex",
        "userId": "6912345678901234567",
        "followerCount": 482301,
        "followingCount": 412,
        "verified": false,
        "avatarUrl": "https://p16-sign.tiktokcdn-us.com/.../avatar.jpeg",
        "signature": "live every Sunday 8pm ET 🛍️"
    },
    "liveRoom": {
        "roomId": "7301234567890123456",
        "status": 2,
        "title": "Sunday product drop - new merch live now",
        "started_at": "2026-06-01T19:42:11Z",
        "started_at_unix": 1748806931,
        "cover_url": "https://p16-sign.tiktokcdn-us.com/.../cover.jpeg",
        "viewer_count": 1342,
        "total_enter_count": 18927,
        "like_count": 94215,
        "comment_count": 2117,
        "stream_urls": {
            "flv": {
                "sd":  "https://pull-flv-l1-mus.tiktokcdn.com/.../stream-123_sd.flv",
                "hd":  "https://pull-flv-l1-mus.tiktokcdn.com/.../stream-123_hd.flv",
                "uhd": "https://pull-flv-l1-mus.tiktokcdn.com/.../stream-123_uhd.flv"
            },
            "hls": {
                "sd":  "https://pull-hls-l1-mus.tiktokcdn.com/.../stream-123_sd.m3u8",
                "hd":  "https://pull-hls-l1-mus.tiktokcdn.com/.../stream-123_hd.m3u8",
                "uhd": "https://pull-hls-l1-mus.tiktokcdn.com/.../stream-123_uhd.m3u8"
            },
            "cmaf": {
                "hd":  "https://pull-cmaf-l1-mus.tiktokcdn.com/.../stream-123_hd.m3u8"
            }
        }
    },
    "_metadata": {
        "page": 1,
        "fetched_at": "2026-06-01T19:43:02Z",
        "input_identifier": "thejustalex"
    }
}
```

When the creator is offline (`is_live: false`):

```json
{
    "handle": "thejustalex",
    "is_live": false,
    "liveRoomUserInfo": {
        "nickname": "Just Alex",
        "uniqueId": "thejustalex",
        "followerCount": 482301,
        "avatarUrl": "https://p16-sign.tiktokcdn-us.com/.../avatar.jpeg"
    },
    "liveRoom": null,
    "_metadata": {
        "page": 1,
        "fetched_at": "2026-06-01T19:43:02Z",
        "input_identifier": "thejustalex"
    }
}
```

If you set `include_stream_urls: false`, the `liveRoom.stream_urls` object is omitted; everything else stays the same.

### Inputs

One input field. Paste one entry or many. Each entry can be a handle or a TikTok URL - mix freely. Duplicates are deduplicated.

| Input | Type | Required | Description | Example |
|---|---|---|---|---|
| `handles` | array of strings | yes | One or more entries. Each is a TikTok handle (with or without `@`) or a TikTok URL. | `["creator1", "@creator2", "https://www.tiktok.com/@creator3/live"]` |
| `include_stream_urls` | boolean | no | If `false`, omits multi-quality playback URLs. Default `true`. | `true` |

Accepted entry forms in `handles`:

- `username`
- `@username`
- `https://www.tiktok.com/@username`
- `https://www.tiktok.com/@username/live`
- `https://tiktok.com/@username`
- `tiktok.com/@username`

### Outputs

Each row pushed to the dataset includes:

- `handle`: the handle that was checked
- `is_live`: boolean live status
- `liveRoomUserInfo`: creator profile (nickname, uniqueId, followerCount, avatarUrl, verified, signature)
- `liveRoom`: room metadata (title, started\_at, cover\_url, viewer\_count, total\_enter\_count, like\_count, comment\_count, stream\_urls when `include_stream_urls: true`)
- `_metadata`: `{ page, fetched_at, input_identifier }`
- `error`: populated only on per-item failures; the run still succeeds

The dataset ships with two preset views in the Apify UI: **Live status overview** (handle / is\_live / title / viewers) and **Stream URLs** (handle / is\_live / stream\_urls). Export to JSON, CSV, XLSX, or pull via the Apify API.

### Integrations

The Actor earns its keep by living inside someone's workflow stack. Copy-paste recipes below.

#### Make (Integromat)

Scenario: **Apify > Run an Actor and wait for it to finish** -> **Apify > Get dataset items** -> **Iterator** -> **Router** with a filter on `is_live`.

Apify "Run an Actor" module config:

```json
{
    "actorId": "UnseenUser/tiktok-live-status-scraper",
    "input": {
        "handles": ["creator1", "creator2", "creator3"],
        "include_stream_urls": true
    },
    "memoryMbytes": 512,
    "timeoutSecs": 120
}
```

Router filter on the live branch:

```
{{1.is_live}} = true
```

Slack > Create a message module body:

```
🔴 {{1.liveRoomUserInfo.nickname}} (@{{1.handle}}) is LIVE right now
"{{1.liveRoom.title}}" - {{1.liveRoom.viewer_count}} viewers
Followers: {{1.liveRoomUserInfo.followerCount}}
Join: https://www.tiktok.com/@{{1.handle}}/live
```

Schedule the Make scenario to run every 5 minutes. Done.

#### n8n

Two-node flow: **Schedule Trigger** -> **HTTP Request** -> **IF** node on `is_live` -> **Slack** (or **Discord** / **Telegram**).

HTTP Request node config (n8n JSON snippet you can paste into the node):

```json
{
    "method": "POST",
    "url": "https://api.apify.com/v2/acts/UnseenUser~tiktok-live-status-scraper/run-sync-get-dataset-items",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpQueryAuth",
    "queryParameters": {
        "parameters": [
            { "name": "token", "value": "={{$env.APIFY_TOKEN}}" }
        ]
    },
    "sendBody": true,
    "contentType": "json",
    "jsonBody": "={{ { handles: ['creator1', 'creator2', 'creator3'], include_stream_urls: true } }}"
}
```

IF node condition: `{{$json["is_live"]}}` equals `true`.

Slack node text:

```
🔴 {{$json["liveRoomUserInfo"]["nickname"]}} is LIVE: "{{$json["liveRoom"]["title"]}}" - {{$json["liveRoom"]["viewer_count"]}} viewers. https://www.tiktok.com/@{{$json["handle"]}}/live
```

#### Zapier

1. **Trigger:** Schedule by Zapier - every 5 minutes.
2. **Action:** Apify > Run Actor (`UnseenUser/tiktok-live-status-scraper`). Input as JSON:

   ```json
   {
       "handles": ["creator1", "creator2", "creator3"],
       "include_stream_urls": true
   }
   ```
3. **Action:** Apify > Get Dataset Items (use the run's default dataset id from step 2).
4. **Filter by Zapier:** continue only if `Is Live` exactly matches `true`.
5. **Action:** Slack > Send Channel Message.

   ```
   🔴 {{liveRoomUserInfo__nickname}} (@{{handle}}) just went live - {{liveRoom__viewer_count}} viewers. https://www.tiktok.com/@{{handle}}/live
   ```

#### Plain webhook (no automation platform)

Configure the Actor's **Integrations** tab in Apify Console to POST every run's dataset to your URL. Apify sends:

```json
{
    "eventType": "ACTOR.RUN.SUCCEEDED",
    "resource": {
        "id": "ACTOR_RUN_ID",
        "actId": "UnseenUser/tiktok-live-status-scraper",
        "defaultDatasetId": "DATASET_ID",
        "status": "SUCCEEDED"
    }
}
```

Your handler then GETs the dataset:

```
curl "https://api.apify.com/v2/datasets/DATASET_ID/items?token=APIFY_TOKEN"
```

and iterates rows. Sketch in Node:

```js
import express from 'express';
const app = express();
app.use(express.json());

const lastState = new Map();

app.post('/apify-webhook', async (req, res) => {
    const datasetId = req.body.resource.defaultDatasetId;
    const items = await fetch(
        `https://api.apify.com/v2/datasets/${datasetId}/items?token=${process.env.APIFY_TOKEN}`,
    ).then((r) => r.json());

    for (const row of items) {
        const prev = lastState.get(row.handle) ?? false;
        if (!prev && row.is_live) {
            await fetch(process.env.SLACK_WEBHOOK_URL, {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({
                    text: `🔴 @${row.handle} is LIVE: "${row.liveRoom.title}"`,
                }),
            });
        }
        lastState.set(row.handle, row.is_live);
    }
    res.sendStatus(200);
});

app.listen(3000);
```

### Comparison: Live Status Checker vs live-stream downloaders

|  | **This Actor (Live Status Checker)** | **agentx-style downloader** |
|---|---|---|
| Output | Status flag + room metadata + playback URLs | Full recorded MP4 file |
| Use case | Monitoring, alerts, dashboards | Archiving, post-stream analysis |
| Speed | Sub-second response per handle | Minutes to hours per stream |
| Cost shape | Cheap per check, scales with poll frequency | Pays for the full stream duration each time |
| Per-run cost (typical) | Fractions of a cent per handle checked | Several dollars per hour of stream recorded |
| Batch | Yes - dozens of handles per run | Typically one stream per run |
| Works on offline creators | Yes (returns `is_live: false`) | No (nothing to record) |

**We're cheaper, faster, and designed for monitoring, not recording. If you want to record, use agentx. If you want alerts and dashboards, use us.**

They are complementary, not competitive. A common combo:

```
This Actor (every 5 min)  -> detects "creator just went live"
        -> kicks off agentx for that one specific creator, only for the streams you actually want to archive
```

That way you only pay downloader compute for the streams that matter.

### Use cases

- **Brand sponsorship monitoring** - paid creator activations: verify the live happened, capture viewer counts as ROI evidence
- **Competitive live-event tracking** - when does competitor X go live, how big do they get, what's their cadence
- **Fan-engagement automation** - notify subscribers when their favourite streamer is on
- **Esports and gaming live monitoring** - who is streaming right now in your vertical
- **Agency creator-watch tools** - talent manager dashboards showing roster live state in real time
- **Live-commerce intelligence** - catch product drops as they happen, log peak viewers per drop
- **News and event coverage** - which creators are covering a major event live right now
- **Discovery / community surfacing** - "currently live" feed in your own community app

### Quick start

1. Click **Try for free** on this Actor's page
2. Enter a TikTok handle, or a list of handles for batch mode
3. Run the Actor
4. Download results as JSON, CSV, or XLSX, or pull via the Apify API
5. To monitor continuously, attach the Actor to a **Schedule** in the Apify Console and add a webhook integration to push results into Slack / Make / n8n / Zapier / your endpoint

### FAQ

**Q: How often can I check?**
A: As often as you want. There is no per-Actor rate limit imposed here. Practical cadences: every 1-2 minutes for go-live alerts where seconds matter (sports, product drops), every 5 minutes for typical brand monitoring, every 15-60 minutes for dashboards that just need rough cadence. Costs scale linearly with frequency, so pick the loosest cadence that meets your latency budget.

**Q: What timezone are the timestamps in?**
A: All timestamps in the output (`liveRoom.started_at`, `_metadata.fetched_at`) are ISO 8601 in UTC. `started_at_unix` is a Unix epoch seconds integer for easy diffing. Convert to your local TZ in your downstream system.

**Q: Can I record the stream with this Actor?**
A: **No.** This is a status checker. The `stream_urls` returned are signed and live-only - they become invalid the moment the stream ends or the signature expires (often minutes). The Actor writes no media. To record, use a dedicated downloader (see the comparison above) and only with creator authorisation, because rebroadcasting triggers separate rights (creator performance, music licensing, platform terms).

**Q: Does it work for private streams, sub-only streams, or TikTok LIVE Studio streams?**
A: No. The Actor only surfaces what is publicly visible on the live room endpoint. Private, friends-only, sub-only, and gated streams are not exposed.

**Q: Are there rate limits I should worry about?**
A: No published rate limit applies to this Actor. Be reasonable with batch size and frequency; very large batches polled every minute will scale up Actor compute usage, which is what you pay for. There is also an Apify-side concurrency cap per account - check your plan.

**Q: Why is `viewer_count` lower than what I see in the TikTok app?**
A: TikTok displays a smoothed / rolling count in some surfaces. The Actor returns the room's current concurrent viewer count and the room's cumulative `total_enter_count`. Use `total_enter_count` for "how many uniques came through this stream" and `viewer_count` for "concurrent right now".

**Q: What happens to a run when one handle in a batch fails?**
A: The bad handle gets a row with an `error` field; every other handle still gets its normal row. The run finishes with status `SUCCEEDED`. You will never lose 99 good rows because one handle 404'd.

**Q: What happens when the cap is hit on the free plan?**
A: The run finishes with status `SUCCEEDED` and a status message explaining the 50-item cap. Your first 50 rows are fully usable. Upgrade to any paid Apify plan to lift the cap.

**Q: Can I use this in Make / n8n / Zapier?**
A: Yes - see the [Integrations](#integrations) section above for copy-paste recipes for all three plus a plain webhook example.

**Q: Do the stream URLs expire?**
A: Yes. They are signed CDN URLs valid only while the stream is live, often re-signed every few minutes. Treat them as ephemeral: fetch, play, discard. Do not store them.

**Q: How many handles can I put in one batch?**
A: There is no hard cap in the code. Practically, hundreds work fine in a single run. For very large rosters (1,000+), split across multiple scheduled runs so a single hiccup doesn't delay the whole batch.

**Q: Is this legal?**
A: Your downstream use of the data is your responsibility. See the Terms of Service and the Actor-specific addendum below.

**Q: Do I need any third-party account?**
A: No. You only need an Apify account.

**Q: What about TikTok's anti-scraping enforcement?**
A: TikTok's Terms restrict automated extraction. Your downstream use of any data obtained through this Actor must comply with TikTok's Terms.

**Q: What if TikTok sends a cease-and-desist?**
A: Notify UnseenUser within 48 hours via the Apify profile contact form (apify.com/UnseenUser) and cease using this Actor immediately.

**Q: Can I use this data to train AI?**
A: No. TikTok's Terms explicitly prohibit AI training on TikTok data, and creators retain copyright in their content.

**Q: What about minors?**
A: TikTok has many under-18 users. This Actor's Terms strictly prohibit using data of users you know or suspect are minors. See the addendum below.

### Related scrapers

Complete the TikTok creator monitoring stack:

- [TikTok User Search](https://apify.com/unseenuser) - find creators to monitor for live events
- [TikTok Audience Geography](https://apify.com/unseenuser) - qualify which creators are worth monitoring
- [TikTok Followers & Following](https://apify.com/unseenuser) - map the creator network around live events

[See all scrapers by UnseenUser](https://apify.com/unseenuser)

### Technical notes

- Output: streamed to the Apify dataset (one row per handle, per run)
- Format: JSON, CSV, XLSX, or via the Apify API
- Retries: 3 with exponential backoff (1s, 2s, 4s) on transient upstream errors
- Per-item failures emitted as dataset rows with an `error` field; the run itself does not crash
- Two dataset views ship out of the box (`overview`, `stream_urls`)
- OpenAPI schema for the in-run live-view server is bundled (`/health`, `/status`, `/results`)

***

## Apify Actor - Terms of Service

**Version:** 4.0
**Effective Date:** May 5, 2026

### 0. ACCEPTANCE BY USE - IMPORTANT

Read this section first.

These Terms of Service ("Terms") form a binding legal agreement between you ("User", "you", "your") and UnseenUser, the Publisher of this Apify actor ("UnseenUser", "the Publisher", "we", "us", "our").

#### 0.1 How You Accept These Terms

You accept these Terms by any of the following actions, each of which constitutes a clear, affirmative act of acceptance:

- (a) Running the Actor: initiating any execution of the Actor on the Apify platform
- (b) Using any output returned by the Actor for any purpose
- (c) Continuing to access the Actor's listing or documentation after these Terms are visible

#### 0.2 Continuing Acceptance

Each time you run the Actor or use its outputs, you reaffirm your acceptance of the then-current Terms. If you do not agree to these Terms or any subsequent update, you must stop using the Actor immediately.

#### 0.3 No Anonymous Acceptance

You cannot disclaim acceptance by:

- Failing to read these Terms before running the Actor
- Running the Actor through automated systems
- Sharing your Apify account with others who may not have read these Terms

By the act of running the Actor on Apify, you bind yourself, your organization (if applicable), and any individuals or systems acting on your behalf or under your authority.

#### 0.4 If You Do Not Accept

If you do not agree to these Terms, you must not run the Actor. No use is authorized without acceptance.

### 1. NATURE OF THE SERVICE

The Actor is a software program published on the Apify platform. It accepts structured input from you, processes it, and returns structured output to you on the Apify platform. The Actor's source code is hosted on Apify's infrastructure. The Actor runs in Apify's cloud, not on the Publisher's servers.

The Actor is not a scraping tool the Publisher operates, not a data storage service, not affiliated with or endorsed by any source platform, and not a licensed access channel to TikTok or any other source platform.

The Publisher is a software vendor. The Publisher is not a data provider, data broker, data processor, or data controller for purposes of GDPR, CCPA, Israel's Privacy Protection Law, or equivalent.

### 2. WHO MAY USE THE ACTOR

You may use the Actor only if you are at least 18 years old (or the age of majority in your jurisdiction), have legal capacity to enter into binding contracts, are not located in a country subject to comprehensive sanctions by the United States, European Union, United Kingdom, or Israel, and are not on any prohibited persons list.

By using any Actor, you represent and warrant that the information you provide about your identity and intended use is accurate, your intended use complies with applicable law, you will independently comply with the Terms of Service of any source platform whose data you obtain, you will respect data subject rights, and you will not use the Actor for any of the purposes prohibited in Section 4.

### 3. PERMITTED USES

The Actor may be used for any lawful purpose, including market research and competitive analysis, academic research, journalism and investigative reporting, internal business intelligence, brand monitoring, recruitment research where consistent with applicable employment law, and building products that further process publicly available information lawfully.

### 4. PROHIBITED USES

You may not use the Actor for any illegal activity, harassment, stalking, doxxing, discrimination, spam, fraud, source platform abuse, reselling raw Actor outputs as your own data product, training commercial AI/ML models without separate licensing authority from the source platform, targeting based on sensitive characteristics, targeting children under 16, or processing personal data in violation of applicable privacy law.

### 5. SOURCE PLATFORM TERMS - YOUR RESPONSIBILITY

You are solely responsible for ensuring your downstream use of data obtained through the Actor complies with the Source Platform's Terms of Service. The Publisher makes no representation that any specific use is permitted under any Source Platform's terms.

TikTok terms: https://www.tiktok.com/legal/page/global/terms-of-service/en

If you receive a cease-and-desist letter or other legal demand from a Source Platform regarding your use of Actor outputs, cease the contested use immediately, notify UnseenUser within 48 hours via UnseenUser's Apify profile contact form (https://apify.com/UnseenUser), cooperate with the Publisher as needed to mitigate, and not assert against the Publisher any claim arising from your inability to use the Actor for that Source Platform.

### 6. DATA PROTECTION

You (the User) are the Data Controller of any personal data you obtain through the Actor and subsequently process for your own purposes. The Publisher acts solely as a software vendor, not as a data controller or processor, because the Publisher does not store, retain, or substantively process personal data.

Where your use of the Actor involves processing personal data, you are responsible for establishing a lawful basis for your processing, providing transparent notice to data subjects, honoring data subject access, rectification, erasure, restriction, and portability requests, implementing appropriate security measures, conducting Data Protection Impact Assessments where required, appointing a Data Protection Officer if your operations require one, registering databases with applicable supervisory authorities, honoring opt-out requests for direct marketing, and applying cross-border transfer safeguards.

### 7. INTELLECTUAL PROPERTY

The Actor's source code, schemas, documentation, and branding are owned by the Publisher. You receive a limited, non-exclusive, non-transferable, revocable license to use the Actor for permitted purposes during your active subscription/run with Apify.

The Publisher claims no ownership over the public data the Actor returns. Source Platforms may have copyright, database rights, or other rights in their data; data subjects may have copyright in user-generated content.

You may not reverse engineer, decompile, or reuse the Actor's code in a competing actor.

### 8. PRICING AND PAYMENT

Pricing is administered through Apify's pricing models. Apify processes all payments. Apify's payment terms govern refunds and disputes. The Publisher may change Actor pricing with at least 14 days' notice via the Actor's Apify listing.

### 9. SERVICE AVAILABILITY AND CHANGES

The Actor depends on the Apify platform, underlying infrastructure, and the continued public accessibility of Source Platforms. Any of these may change behavior, restrict access, or become unavailable without notice. The Publisher makes no uptime guarantees.

### 10. DISCLAIMERS

THE ACTOR IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTIES OF ANY KIND. The Publisher makes no representation that your specific use of the Actor or the data it returns is lawful in your jurisdiction or under any Source Platform's terms.

### 11. LIMITATION OF LIABILITY

TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL THE AGGREGATE LIABILITY OF THE PUBLISHER FOR ALL CLAIMS RELATING TO THE ACTOR EXCEED THE GREATER OF (a) ONE HUNDRED U.S. DOLLARS (US $100), OR (b) THE AMOUNTS YOU PAID THROUGH APIFY FOR USE OF THE ACTOR IN THE THREE (3) MONTHS IMMEDIATELY PRECEDING THE EVENT. The Publisher is not liable for indirect, incidental, special, consequential, exemplary, or punitive damages. Any claim must be brought within one (1) year of the event.

### 12. INDEMNIFICATION

You agree to defend, indemnify, and hold harmless the Publisher from any claims arising from your use of the Actor, your violation of these Terms, your violation of any law, your violation of any Source Platform's Terms of Service, and your processing of personal data obtained through the Actor.

### 13. SUSPENSION AND TERMINATION

The Publisher may terminate your access for material breach, illegal use, breach of warranty, or upon credible legal demand. You may stop using the Actor at any time on Apify.

### 14. DISPUTE RESOLUTION

Send a detailed written description of any dispute via UnseenUser's Apify profile contact form (https://apify.com/UnseenUser) and wait 60 days for a resolution attempt before any formal claim. These Terms are governed by the substantive laws of the State of Israel, without regard to conflict of law principles. Any dispute shall be brought exclusively in the competent civil courts of Tel Aviv-Jaffa, Israel. You agree to bring claims only in your individual capacity. The prevailing party recovers reasonable attorneys' fees.

### 15. MISCELLANEOUS

These Terms (with the Addendum below) are the entire agreement. Unenforceable provisions are reformed to the minimum extent or severed. You may not assign without the Publisher's consent. Neither party is liable for failure due to events beyond reasonable control. Sections 0, 4, 5, 6, 7, 10, 11, 12, 14, and 15 survive termination. English controls. The Publisher operates on the Apify platform under the username **UnseenUser** (apify.com/UnseenUser). Upon receipt of valid legal process directed through Apify's official channels, the Publisher's full legal identity may be disclosed as required by law.

***

## Actor-Specific Terms of Service Addendum

This addendum supplements the Master Terms of Service V4.0. By running this Actor, you accept both the Master ToS and this addendum.

### A. Architectural disclosure

This Actor is a software wrapper. It accepts your input parameters, performs the live-status check, and returns the response data to you on the Apify platform. UnseenUser does not store, log, or substantively process the data returned.

### B. Nature of data returned

This Actor returns: live status (boolean), room information (title, start time, status, cover URL), live stats (current viewer count, total enter count), and stream data (multi-quality FLV/HLS/CMAF playback URLs). Returns null/false when the creator is not currently live.

Where the Actor's output includes individual people's names, photos, contact details, or content authored by them, that data constitutes personal data subject to GDPR, CCPA, Israeli Privacy Protection Law (including Amendment 13), and equivalent privacy laws in your downstream processing - but only in your hands as the data controller, not in UnseenUser's hands as the software vendor.

### C. Permitted use cases

- Live-commerce monitoring: track when specific creators go live with product drops
- Brand campaign tracking: monitor when paid creators activate live streams for your campaign
- Real-time creator analytics: log when creators go live + peak viewer counts
- Event coverage: track live-stream activity around major events
- Competitor monitoring: see when competing brand ambassadors go live
- Discovery: find creators currently live in specific verticals (when combined with discovery actors)
- Notification systems: build user-facing apps that notify when followed creators go live

### D. Specifically prohibited uses

In addition to Master ToS Section 4 prohibitions, you may NOT:

- Build TikTok-replacement live-stream players that serve TikTok streams in your own UI without authorization
- Record and rebroadcast live streams without creator authorization
- Build mass-monitoring tools that surveil specific creators' live activity over time without their knowledge
- Use live status data to coordinate mass-DMing or brigading of creators who are currently live
- Use stream URLs to bypass TikTok's geo-restrictions or commerce restrictions
- Train commercial AI on live-stream content extracted via this Actor

### E. Platform Terms of Service considerations

TikTok's Terms of Service prohibit automated extraction. Live stream rebroadcasting is particularly sensitive (multiple overlapping rights). If TikTok issues a cease-and-desist, notify UnseenUser within 48 hours via the Apify profile contact form (apify.com/UnseenUser).

### F. Stream URLs - capability, not authorization

This Actor returns multi-quality stream URLs that allow direct playback of TikTok live streams. Possession of these URLs does NOT grant rebroadcast rights. You may use the URLs for real-time viewing in your own monitoring dashboards, status checking, and personal use. You may NOT rebroadcast, record and republish, aggregate streams into a "TikTok live stream aggregator" product, or strip TikTok branding when displaying stream content.

### G. Real-time surveillance concerns

Real-time live status is more privacy-sensitive than historical data because it enables real-time targeting. Don't use this Actor for surveillance of specific individuals.

- OK: "Is creator X live RIGHT NOW so we can engage with their stream?"
- OK: Batch checking 50 brand ambassadors to see who's live (commercial campaign use)
- NOT OK: Logging every time creator X goes live for the last 6 months (surveillance, even if data is public)

### H. Live commerce considerations

If you monitor for live-commerce purposes, don't use the data to undercut creators, don't scrape live-stream pricing for resale, and don't use viewer counts to inflate or deflate creator reputation for commercial reasons.

### I. Minor protection - live stream specific

TikTok has heightened protections for minors in live streams. If you use this Actor, don't surveil minor creators for any commercial purpose, don't use the Actor to identify minors who are currently live, and if a creator's age signals suggest minor status, exclude them from your monitoring.

### J. Stream availability vs. recording

The Actor returns CURRENT stream URLs (only valid while the stream is live). After the stream ends, the URLs become invalid. The Actor does NOT record streams to permanent storage, provide replay URLs, or generate transcripts of live content. If you need recordings, obtain creator authorization and use proper recording infrastructure.

# Actor input Schema

## `handles` (type: `array`):

One or more entries. Each entry can be a handle (with or without @) or a TikTok URL. Accepted forms: 'username', '@username', 'https://www.tiktok.com/@username', 'https://www.tiktok.com/@username/live', 'tiktok.com/@username'. Mix freely; duplicates are deduplicated.

## `include_stream_urls` (type: `boolean`):

If false, returns only live status + room info (no multi-quality stream URLs).

## Actor input object example

```json
{
  "handles": [],
  "include_stream_urls": true
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("unseenuser/tiktok-live-status-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("unseenuser/tiktok-live-status-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call unseenuser/tiktok-live-status-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=unseenuser/tiktok-live-status-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "TikTok Live Status Monitor - Stream URLs [NO LOGIN] ✅",
        "description": "Check if any TikTok handle is currently live and get the stream playback URLs. Returns room ID, viewer count, stream quality URLs. NOT a recorder - status + URLs only. No login, no cookies. Built for brand alerts, creator monitoring, and live event tracking.",
        "version": "0.0",
        "x-build-id": "xhaivL43Do2vNiaSg"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/unseenuser~tiktok-live-status-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-unseenuser-tiktok-live-status-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/unseenuser~tiktok-live-status-scraper/runs": {
            "post": {
                "operationId": "runs-sync-unseenuser-tiktok-live-status-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/unseenuser~tiktok-live-status-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-unseenuser-tiktok-live-status-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "handles"
                ],
                "properties": {
                    "handles": {
                        "title": "TikTok handles or URLs",
                        "minItems": 1,
                        "uniqueItems": true,
                        "type": "array",
                        "description": "One or more entries. Each entry can be a handle (with or without @) or a TikTok URL. Accepted forms: 'username', '@username', 'https://www.tiktok.com/@username', 'https://www.tiktok.com/@username/live', 'tiktok.com/@username'. Mix freely; duplicates are deduplicated.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "include_stream_urls": {
                        "title": "Include stream URLs",
                        "type": "boolean",
                        "description": "If false, returns only live status + room info (no multi-quality stream URLs).",
                        "default": true
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
