# TikTok Scraper - Profiles, Videos, Stats & Creator Leads (`scrapesage/tiktok-scraper`) Actor

Scrape TikTok creator profiles and video details with no login: follower & engagement stats, bios, music, download URLs, plus emails & social handles for creator lead-gen with a 0-100 lead score. Hashtags, search & comments with your login cookie. Export CSV/JSON, pay per result.

- **URL**: https://apify.com/scrapesage/tiktok-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (community)
- **Categories:** Social media, Videos, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 profile scrapeds

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

<!--
DEMAND RECEIPT (BUILD STANDARDS Gate 2) — why this actor exists:
  • Store competitor with massive usage on the SAME target: clockworks/tiktok-scraper = 214,020 total
    users / 17,314 monthly; clockworks/tiktok-profile-scraper 31,010u; apidojo/tiktok-profile-scraper
    3,627u; clockworks/tiktok-video-scraper 12,028u. TikTok is one of the largest proven demand pools on
    Apify, and scrapesage had NO general tiktok scraper (only tiktok-ad-library-scraper = ads).
  • ABSENT from the account (grepped all 299 actors) and not on scrapersdelight's list (Gate 3b) — no overlap.
  • TRANSPORT REALITY (validated on-platform, not assumed — BUILD STANDARDS §2): TikTok's "Please wait"
    Slardar WAF is IP-reputation gated and clears on Apify residential + Camoufox. Profile and single-video
    pages server-render full JSON (rich, no login). But TikTok GATES its list APIs (profile feeds, hashtag
    feeds, search, comments) for logged-out sessions — /api/post/item_list returns HTTP 200 with an EMPTY
    body when user_is_login=false (confirmed by dumping raw payloads). So those modes need a BYO login cookie.
  • WEDGE over the content-metric incumbents: CREATOR LEAD-GEN — bio link, e-mail & social handles extracted
    from every profile, optional bio-link crawl, 0-100 lead score. Plus complete video records incl. the
    download URL and full music object. No login, no start fee, pay per result.
-->
## TikTok Scraper - Profiles, Videos, Stats & Creator Leads

Scrape **TikTok** creator **profiles** and **video** details with **no login** - follower and engagement stats, bios, music, download URLs, and a creator **lead-gen** layer (e-mails and social handles). Hashtag, search and comment scraping are supported with **your own login cookie**. Export to JSON, CSV or Excel, run on a schedule, or call from the API / an AI agent.

### What you can scrape

| Input | Needs login? | You get |
|---|---|---|
| **Profiles** (`@tiktok`, `tiktok`, profile URL) | **No** | Username, name, bio, verified & private flags, region, avatar, **follower / following / likes / video counts**, business-account & seller signals, **bio link**, plus **e-mail & social handles** parsed from the bio, and a **0-100 lead score**. |
| **Video URLs** | **No** | Full video detail: description, hashtags, create time, **play / like / comment / share / save counts**, duration, cover, **download URL**, music title & author, author username. |
| **Profile video feeds** (videos per profile) | Cookie | Each profile's recent videos. |
| **Hashtags** | Cookie | A hashtag's videos + view/video counts. |
| **Search** (keywords) | Cookie | Videos or users matching each query. |
| **Comments** (per video) | Cookie | Top comments with like/reply counts and commenter info. |

> **Why some modes need a cookie:** TikTok serves an **empty response** to its feed / hashtag / search / comment APIs for logged-out sessions. Profile and single-video pages are server-rendered and need no login. To unlock the rest, paste your own TikTok `sessionid` into the **TikTok login cookie** input (see below). This scraper is honest about the gate rather than returning silently empty results.

### Why this scraper

- **Creator lead-gen built in.** Most TikTok scrapers stop at content metrics. This one turns a creator into an outreach-ready lead: bio link, e-mail (incl. `name (at) brand (dot) com` de-obfuscation), Instagram / YouTube / X / Snapchat / Facebook handles, and - with **Enrich bio link** - a crawl of their Linktree / Beacons / business site for e-mails, phones and socials, scored 0-100.
- **Complete video records.** Every engagement count (incl. saves), duration, cover, the **direct download URL**, and the full music object - not just a thin subset.
- **Reliable by design.** A dual-lane transport (fast HTTP for detail pages + an anti-detect browser that clears the "Please wait" WAF) means a transient block degrades to a slower lane, never to a failed run. Runs self-stop before the platform time limit and always finish cleanly - accurate counts too (TikTok's legacy 32-bit like counts that overflow negative for mega-creators are corrected).
- **No login for the core, no start fee, pay per result.**

### Input

```json
{
  "profiles": ["tiktok", "https://www.tiktok.com/@spacex"],
  "videoUrls": ["https://www.tiktok.com/@nasa.etw/video/7633321198176210190"],
  "enrichBioLink": true,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }
}
````

With **no input** the actor runs a tiny sample (`@tiktok`) so a first "Try it" always returns data. **Residential proxies are strongly recommended** - TikTok serves its WAF challenge to datacenter IPs.

#### Unlocking hashtags / search / feeds / comments

Paste your own TikTok login cookie into **`sessionCookie`** - either the bare `sessionid` value or a full cookie string (`sessionid=...; tt_csrf_token=...`). Get it from your browser's DevTools → Application → Cookies on `tiktok.com` while logged in. Treat it like a password (it's a secret input). Then set `maxVideosPerProfile`, `hashtags`, `searchQueries` or `commentsPerVideo`.

#### Key options

- **maxItems** - cap on list items (videos / users / comments) per source. `0` = no limit (still self-stops before the time limit).
- **maxVideosPerProfile** - `0` = profile record only (no cookie needed); `>0` also pulls recent videos (needs cookie).
- **includeVideoDetails** - open each listed video for the richest record.
- **enrichBioLink** - crawl each creator's bio link for e-mails/phones/socials (billed per profile).
- **monitorMode** / **monitorStoreName** - only-new-items tracking.

### Output (shapes)

**Profile**

```json
{
  "type": "profile", "username": "tiktok", "nickname": "TikTok",
  "url": "https://www.tiktok.com/@tiktok", "verified": true, "businessAccount": true,
  "region": "US", "followerCount": 94800000, "heartCount": 461600000, "videoCount": 1466,
  "bioLink": "linktr.ee/tiktok", "email": "...", "socialHandles": { "instagram": "..." }, "leadScore": 67
}
```

**Video**

```json
{
  "type": "video", "videoId": "744811...", "url": "https://www.tiktok.com/@user/video/744811...",
  "authorUsername": "user", "description": "...", "playCount": 9000000, "diggCount": 500000,
  "commentCount": 8000, "shareCount": 12000, "collectCount": 40000, "durationSec": 30,
  "downloadUrl": "https://...", "musicTitle": "Original sound", "hashtags": ["space"]
}
```

### Use with AI assistants (MCP)

This actor works as a tool in any MCP-compatible assistant (Claude, Cursor, VS Code). Point your client at Apify's MCP server (`https://mcp.apify.com`) and call `scrapesage/tiktok-scraper` like any other tool - great for "pull this creator's stats and contact info" or "get the details for this TikTok video" agent workflows.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** - AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** - an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) - no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** - agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### Pricing (pay per event)

| Event | Price |
|---|---|
| Profile scraped | $0.004 |
| Video scraped | $0.002 |
| Comment scraped | $0.001 |
| Enriched creator lead (bio-link crawl) | $0.005 |

No monthly fee and no per-run start fee - you pay only for the records you receive.

### FAQ

**Do I need to log in?** Not for profiles or video URLs - those are the core, no-login modes. Hashtags, search, profile feeds and comments require your own TikTok login cookie because TikTok gates those APIs for logged-out sessions.

**Why residential proxies?** TikTok shows a "Please wait" WAF challenge to datacenter/flagged IPs. Residential IPs get the real page; the actor defaults to Apify residential (US).

**Is scraping TikTok legal?** The actor collects only publicly available data. You are responsible for using the output in line with TikTok's terms and applicable law (e.g. GDPR/CCPA for any personal data), and for how you obtain and use any login cookie you supply.

**A hashtag/search run returned 0 records.** Those modes need a login cookie (`sessionCookie`). Add one, or use profile / video-URL scraping which needs none. Empty runs aren't billed on pay-per-event.

# Actor input Schema

## `profiles` (type: `array`):

TikTok usernames or profile URLs. Accepts '@tiktok', 'tiktok' or 'https://www.tiktok.com/@tiktok'. Each yields one rich profile/creator record: follower/like/video counts, bio, region, verified & business flags, bio link, e-mail & social handles extracted from the bio, and a 0-100 lead score. Works without any login.

## `videoUrls` (type: `array`):

Specific TikTok video URLs (or IDs) for full detail: description, hashtags, play/like/comment/share/save counts, duration, cover image, download URL, and music title & author. Accepts 'https://www.tiktok.com/@user/video/123...' or a bare numeric video ID. Works without any login.

## `hashtags` (type: `array`):

Hashtag names or URLs. Accepts 'space', '#space' or 'https://www.tiktok.com/tag/space'. Returns the hashtag's videos (and view/video counts). NOTE: TikTok gates hashtag feeds for logged-out sessions - this mode returns data only when you provide a 'TikTok login cookie' below. Profile and video-URL scraping do NOT need a cookie.

## `searchQueries` (type: `array`):

Keywords to search TikTok. Returns videos (or users, see 'Search type'), up to 'Max items' per query. NOTE: TikTok gates search for logged-out sessions - this mode returns data only when you provide a 'TikTok login cookie' below.

## `searchType` (type: `string`):

What each search query returns: videos or user profiles.

## `maxItems` (type: `integer`):

Maximum number of list items (videos, search results or comments) to return per input source. Profile and single-video-URL records are always returned and do not count against this. Set 0 for no limit (the run still self-stops before the platform time limit and returns what it has).

## `maxVideosPerProfile` (type: `integer`):

For each profile, how many of its recent videos to also scrape. 0 = scrape the profile record only (fastest, no cookie needed). NOTE: TikTok gates profile FEEDS for logged-out sessions, so a value > 0 returns videos only when you provide a 'TikTok login cookie' below. The profile record itself always works without one.

## `includeVideoDetails` (type: `boolean`):

When listing videos (profile feeds, hashtags, search), open each video page for the richest record (exact save/collect count, full music object, sticker/subtitle info). Slower and costlier. Off by default because the feed already carries description, all engagement counts, duration, cover, music and hashtags.

## `commentsPerVideo` (type: `integer`):

How many top comments to scrape per video (for videos in 'Video URLs'). 0 = no comments. NOTE: TikTok gates comments for logged-out sessions, so this returns data only with a 'TikTok login cookie' below. Video details themselves need no cookie. Each comment is billed separately.

## `sessionCookie` (type: `string`):

Optional. Paste your own TikTok 'sessionid' cookie value (or a full cookie string like 'sessionid=...; tt\_csrf\_token=...') to unlock the login-gated modes: profile video feeds, hashtag feeds, search and comments. TikTok returns empty data on these for logged-out sessions. Profile and video-URL scraping never need this. Get it from your browser's DevTools > Application > Cookies on tiktok.com while logged in. Treat it like a password.

## `enrichBioLink` (type: `boolean`):

For each profile, crawl the creator's bio link (Linktree, Beacons, business site, etc.) for publicly listed e-mail addresses, phone numbers and social profiles - turning a creator into an outreach-ready lead. Billed as an 'Enriched creator lead' add-on per profile.

## `monitorMode` (type: `boolean`):

Remember items seen on previous runs (in a named key-value store) and emit only NEW videos/profiles on later runs. Ideal for scheduled tracking of a creator, hashtag or search.

## `monitorStoreName` (type: `string`):

Named key-value store that holds the 'seen' fingerprints for monitor mode. Leave blank to use a default store per run source.

## `proxyConfiguration` (type: `object`):

Residential proxies are strongly recommended - TikTok serves its 'Please wait' WAF challenge to datacenter/flagged IPs. Defaults to Apify residential (US). You may bring your own proxy URLs.

## `headful` (type: `boolean`):

Run the anti-detect browser headful (recommended - clears the WAF more reliably). Advanced users can disable.

## `debugMode` (type: `boolean`):

Dump raw rendered pages / API payloads to the key-value store for troubleshooting. Leave off for normal runs.

## Actor input object example

```json
{
  "profiles": [
    "tiktok",
    "https://www.tiktok.com/@spacex"
  ],
  "videoUrls": [
    "https://www.tiktok.com/@nasa.etw/video/7633321198176210190"
  ],
  "hashtags": [
    "space",
    "nasa"
  ],
  "searchQueries": [
    "mars rover",
    "space launch"
  ],
  "searchType": "video",
  "maxItems": 100,
  "maxVideosPerProfile": 0,
  "includeVideoDetails": false,
  "commentsPerVideo": 0,
  "enrichBioLink": false,
  "monitorMode": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  },
  "headful": true,
  "debugMode": false
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped TikTok records (profiles, videos, comments, hashtags) as JSON items in the default dataset.

# 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 = {
    "profiles": [
        "tiktok"
    ],
    "maxItems": 100,
    "maxVideosPerProfile": 0,
    "commentsPerVideo": 0,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/tiktok-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 = {
    "profiles": ["tiktok"],
    "maxItems": 100,
    "maxVideosPerProfile": 0,
    "commentsPerVideo": 0,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/tiktok-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 '{
  "profiles": [
    "tiktok"
  ],
  "maxItems": 100,
  "maxVideosPerProfile": 0,
  "commentsPerVideo": 0,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call scrapesage/tiktok-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "TikTok Scraper - Profiles, Videos, Stats & Creator Leads",
        "description": "Scrape TikTok creator profiles and video details with no login: follower & engagement stats, bios, music, download URLs, plus emails & social handles for creator lead-gen with a 0-100 lead score. Hashtags, search & comments with your login cookie. Export CSV/JSON, pay per result.",
        "version": "0.1",
        "x-build-id": "NnHk5nqgBCUKRYmuV"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scrapesage~tiktok-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scrapesage-tiktok-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/scrapesage~tiktok-scraper/runs": {
            "post": {
                "operationId": "runs-sync-scrapesage-tiktok-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/scrapesage~tiktok-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-scrapesage-tiktok-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",
                "properties": {
                    "profiles": {
                        "title": "TikTok profiles (no login needed)",
                        "type": "array",
                        "description": "TikTok usernames or profile URLs. Accepts '@tiktok', 'tiktok' or 'https://www.tiktok.com/@tiktok'. Each yields one rich profile/creator record: follower/like/video counts, bio, region, verified & business flags, bio link, e-mail & social handles extracted from the bio, and a 0-100 lead score. Works without any login.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "videoUrls": {
                        "title": "Video URLs (no login needed)",
                        "type": "array",
                        "description": "Specific TikTok video URLs (or IDs) for full detail: description, hashtags, play/like/comment/share/save counts, duration, cover image, download URL, and music title & author. Accepts 'https://www.tiktok.com/@user/video/123...' or a bare numeric video ID. Works without any login.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "hashtags": {
                        "title": "Hashtags (needs login cookie)",
                        "type": "array",
                        "description": "Hashtag names or URLs. Accepts 'space', '#space' or 'https://www.tiktok.com/tag/space'. Returns the hashtag's videos (and view/video counts). NOTE: TikTok gates hashtag feeds for logged-out sessions - this mode returns data only when you provide a 'TikTok login cookie' below. Profile and video-URL scraping do NOT need a cookie.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchQueries": {
                        "title": "Search queries (needs login cookie)",
                        "type": "array",
                        "description": "Keywords to search TikTok. Returns videos (or users, see 'Search type'), up to 'Max items' per query. NOTE: TikTok gates search for logged-out sessions - this mode returns data only when you provide a 'TikTok login cookie' below.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchType": {
                        "title": "Search type",
                        "enum": [
                            "video",
                            "user"
                        ],
                        "type": "string",
                        "description": "What each search query returns: videos or user profiles.",
                        "default": "video"
                    },
                    "maxItems": {
                        "title": "Max items (videos / users / comments)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of list items (videos, search results or comments) to return per input source. Profile and single-video-URL records are always returned and do not count against this. Set 0 for no limit (the run still self-stops before the platform time limit and returns what it has).",
                        "default": 100
                    },
                    "maxVideosPerProfile": {
                        "title": "Videos per profile (needs login cookie)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "For each profile, how many of its recent videos to also scrape. 0 = scrape the profile record only (fastest, no cookie needed). NOTE: TikTok gates profile FEEDS for logged-out sessions, so a value > 0 returns videos only when you provide a 'TikTok login cookie' below. The profile record itself always works without one.",
                        "default": 0
                    },
                    "includeVideoDetails": {
                        "title": "Include full video details",
                        "type": "boolean",
                        "description": "When listing videos (profile feeds, hashtags, search), open each video page for the richest record (exact save/collect count, full music object, sticker/subtitle info). Slower and costlier. Off by default because the feed already carries description, all engagement counts, duration, cover, music and hashtags.",
                        "default": false
                    },
                    "commentsPerVideo": {
                        "title": "Comments per video (needs login cookie)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "How many top comments to scrape per video (for videos in 'Video URLs'). 0 = no comments. NOTE: TikTok gates comments for logged-out sessions, so this returns data only with a 'TikTok login cookie' below. Video details themselves need no cookie. Each comment is billed separately.",
                        "default": 0
                    },
                    "sessionCookie": {
                        "title": "TikTok login cookie (optional, unlocks feeds/search/comments)",
                        "type": "string",
                        "description": "Optional. Paste your own TikTok 'sessionid' cookie value (or a full cookie string like 'sessionid=...; tt_csrf_token=...') to unlock the login-gated modes: profile video feeds, hashtag feeds, search and comments. TikTok returns empty data on these for logged-out sessions. Profile and video-URL scraping never need this. Get it from your browser's DevTools > Application > Cookies on tiktok.com while logged in. Treat it like a password."
                    },
                    "enrichBioLink": {
                        "title": "Enrich bio link (creator leads)",
                        "type": "boolean",
                        "description": "For each profile, crawl the creator's bio link (Linktree, Beacons, business site, etc.) for publicly listed e-mail addresses, phone numbers and social profiles - turning a creator into an outreach-ready lead. Billed as an 'Enriched creator lead' add-on per profile.",
                        "default": false
                    },
                    "monitorMode": {
                        "title": "Monitor mode (only new items)",
                        "type": "boolean",
                        "description": "Remember items seen on previous runs (in a named key-value store) and emit only NEW videos/profiles on later runs. Ideal for scheduled tracking of a creator, hashtag or search.",
                        "default": false
                    },
                    "monitorStoreName": {
                        "title": "Monitor store name",
                        "type": "string",
                        "description": "Named key-value store that holds the 'seen' fingerprints for monitor mode. Leave blank to use a default store per run source."
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Residential proxies are strongly recommended - TikTok serves its 'Please wait' WAF challenge to datacenter/flagged IPs. Defaults to Apify residential (US). You may bring your own proxy URLs.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ],
                            "apifyProxyCountry": "US"
                        }
                    },
                    "headful": {
                        "title": "Headful browser",
                        "type": "boolean",
                        "description": "Run the anti-detect browser headful (recommended - clears the WAF more reliably). Advanced users can disable.",
                        "default": true
                    },
                    "debugMode": {
                        "title": "Debug mode",
                        "type": "boolean",
                        "description": "Dump raw rendered pages / API payloads to the key-value store for troubleshooting. Leave off for normal runs.",
                        "default": false
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
