# TikTok Video Scraper (`trakk/tiktok-video-scraper`) Actor

Scrape TikTok videos from URLs, profiles, hashtags, keyword search, or trends — one rich record each: engagement stats, author, music, hashtags, no-watermark download and native transcript. Fast, HTTP-only, and you are never charged for unavailable or unmatched videos.

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

## Pricing

from $2.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/docs.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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 Video Scraper: Profiles, Search & Trends

Turn public TikTok content into clean, analysis-ready data. Start with **video URLs, creator profiles, hashtags, keyword searches, or current trends** and receive the same rich schema for every video: captions, engagement, creator details, music, media links, and optional transcripts or downloads.

> ⚡ **HTTP request-only runtime:** no Playwright, Chromium, or headless browser is launched. Deep discovery combines TikTok's public first-party surfaces and validates every selected post through its full public video record.

> ✅ Unavailable, private, deleted, or unmatched posts are written to a separate **Issues** dataset. They are not saved as paid video results.

### 💡 Why this Actor

- ⚡ **Request-only runtime** — no Playwright, Chromium, or headless browser, so runs are faster and cheaper than browser-based TikTok scrapers
- 🎯 **Five sources, one schema** — video/photo URLs, creator profiles, hashtags, keyword search, and current trends all return the same rich record
- 🔒 **Exact-match verification** — every discovered post is validated against the requested creator or hashtag, so you don't pay for unrelated videos
- 🧾 **You don't pay for failures** — private, deleted, or unmatched posts go to a separate **Issues** dataset instead of being charged as results
- 📝 **Transcripts + download links built in** — native captions and permanent video/cover storage URLs when you enable them

#### 📸 Sample output

![TikTok Video Scraper sample output — real data fields](https://api.apify.com/v2/key-value-stores/sAkX2yFx0oRX6gf6p/records/tiktok-video-scraper-sample)

*A real run's output — exportable to JSON, CSV, or Excel.*

### ✨ What you can collect

| Source | Example | What you get |
|---|---|---|
| 🎬 Video or photo URLs | `https://www.tiktok.com/@user/video/...` | One complete record per public post |
| 👤 Creator profiles | `@scout2015` | Recent authoritative posts plus exact-creator deep discovery |
| #️⃣ Hashtags | `travel` | Related public feeds, with every result verified against the exact hashtag |
| 🔎 Keyword search | `ai tools` | The main public feed plus related TikTok topic feeds for deeper runs |
| 🔥 Current trends | Enable **Current trending videos** | Public trending playlist, public discovery, and Creative Center signals |

Every result can include:

- views, likes, comments, shares, saves, and reposts
- full post caption, hashtags, language, location, and AIGC flags
- creator name, username, verification, bio, followers, total likes, and video count
- video dimensions, duration, quality variants, cover, playback, and download URLs
- sound title, author, duration, and audio URL
- TikTok native transcript when captions are available
- permanent video and cover storage links when downloads are enabled

### 🚀 Quick start

#### Scrape direct post URLs

```json
{
  "postUrls": [
    { "url": "https://www.tiktok.com/@apifyoffice/video/7200360993149553925" }
  ],
  "postIds": ["7659338240096226580"],
  "maxItems": 10
}
````

Full URLs, `vm.tiktok.com` short links, and photo posts go in `postUrls`; bare numeric IDs go in `postIds`.

#### Scrape a creator profile

```json
{
  "profiles": ["@scout2015"],
  "maxItems": 50,
  "deepDiscovery": true,
  "maxDiscoveryQueries": 12
}
```

Creator Embed anchors the newest posts. Deep discovery then follows the creator's username, display name, and creator-owned topics to find older publicly indexed posts. Both the discovery row and the full video record are checked against the exact username, so unrelated creators are not included.

The final depth depends on what TikTok exposes publicly for that creator. It can go well beyond the embed window, but it is not a promise to return an account's entire private or non-indexed history.

#### Combine hashtags, search, and trends

```json
{
  "hashtags": ["travel", "foodtok"],
  "searchQueries": ["ai tools", "startup marketing"],
  "trending": true,
  "trendCountry": "US",
  "deepDiscovery": true,
  "maxItems": 50,
  "dedupe": true
}
```

`maxItems` is one global cap for the entire run. If a video appears in several sources, deduplication saves it only once.

#### Collect hundreds of search results

```json
{
  "searchQueries": ["travel"],
  "maxItems": 300,
  "deepDiscovery": true,
  "maxDiscoveryQueries": 8,
  "maxConcurrency": 10
}
```

One TikTok SEO topic feed currently exposes up to about 100 unique videos. Deep discovery follows TikTok's own related-topic graph until the requested limit or query budget is reached. The Actor deduplicates IDs and stops atomically at `maxItems`.

#### Add spoken-word transcripts

```json
{
  "searchQueries": ["technology news"],
  "maxItems": 20,
  "transcript": "native",
  "transcriptLanguage": "eng"
}
```

The Actor uses TikTok's creator or auto-generated captions. Videos without a caption track remain valid results, but do not contain a `transcript` field.

### 🧭 How a run works

```mermaid
flowchart LR
    A[URLs, profiles, hashtags, search, trends] --> B[Discover public videos]
    B --> C[Expand through related first-party feeds]
    C --> D[Verify author or hashtag and deduplicate]
    D --> E[Extract full video details]
    E --> F[Optional transcript and media storage]
    F --> G[Clean dataset views and exports]
```

### 🧭 Deep discovery

Deep discovery is enabled by default and uses a different safe strategy for each source:

- **Profiles:** starts with the authoritative Creator Embed posts, then follows username variants, display-name topics, and hashtags found on exact creator posts. Exact-author checks run before and after full extraction.
- **Hashtags:** scans the main and related public TikTok topic feeds. A candidate is kept only when both discovery metadata and the full post contain the requested hashtag.
- **Search:** combines the primary public topic feed with TikTok's own related keywords. This is how one query can grow beyond a single feed's roughly 100-item window.
- **Trends:** combines TikTok's public trending embed, public `trending` / `fyp` / `viral` discovery surfaces, and country-specific Creative Center ranking signals.

Set `deepDiscovery` to `false` for the smallest and cheapest list scan. Raise `maxDiscoveryQueries` when a large run needs more related feeds; the default is tuned for ordinary 20–100 result jobs.

### ⚙️ Input reference

| Field | Type | Purpose |
|---|---|---|
| `postUrls` | array | TikTok post URLs or short links |
| `postIds` | array | Bare numeric TikTok video IDs |
| `profiles` | array | Creator usernames or profile URLs |
| `hashtags` | array | Hashtags with or without `#` |
| `searchQueries` | array | Keyword or phrase searches |
| `trending` | boolean | Include current ranked trend videos |
| `trendCountry` | string | Country for Creative Center signals; default `US` |
| `deepDiscovery` | boolean | Follow related public TikTok feeds; default `true` |
| `maxDiscoveryQueries` | integer | Maximum public topic feeds scanned per list input; default `12` |
| `maxItems` | integer | Global result cap; default `20` |
| `dedupe` | boolean | Remove repeated video IDs; default `true` |
| `transcript` | string | `never` or `native` |
| `transcriptLanguage` | string | Preferred code such as `eng`, `rus`, or `spa` |
| `shouldDownloadVideos` | boolean | Store available MP4 files |
| `shouldDownloadCovers` | boolean | Store cover images |
| `onlyNewerThan` | integer | Skip posts at or before a Unix timestamp |
| `maxConcurrency` | integer | Parallel video requests |

When `maxItems` is `0`, source safety limits apply per input: up to 50 profile posts, 100 hashtag/search posts, and 50 trend posts.

### 📦 Output

The default dataset provides focused views:

- **Videos**: source, discovery path, matched topic, caption, creator, date, engagement, duration, and hashtags
- **Engagement**: complete interaction metrics, trend source, and available Creative Center signals
- **Creators**: avatar, bio, verification, followers, likes, and posting totals
- **Media**: covers, dimensions, quality, playback, download, storage, and sound URLs
- **Transcripts**: post caption, available languages, transcript source, and full text
- **All fields**: the complete underlying record

Example result, shortened for readability:

```json
{
  "id": "7659338240096226580",
  "url": "https://www.tiktok.com/@ai91882/video/7659338240096226580",
  "source": "search",
  "sourceInput": "openai",
  "sourceRank": 1,
  "discoverySource": "tiktok_seo",
  "discoveryQuery": "openai-tools",
  "text": "Public post caption... #ai #openai",
  "createTimeISO": "2026-07-06T09:04:21+00:00",
  "playCount": 14500,
  "diggCount": 221,
  "commentCount": 14,
  "shareCount": 91,
  "collectCount": 88,
  "authorUsername": "ai91882",
  "authorFollowers": 2370,
  "videoDuration": 127,
  "hashtags": ["ai", "openai"],
  "hasAutoCaption": true,
  "subtitleLanguages": ["eng-US", "cmn-Hans-CN"],
  "transcriptLanguage": "eng-US",
  "transcript": "Full spoken-word transcript..."
}
```

Results are available as **JSON, JSONL, CSV, Excel, XML, RSS**, and through the Apify API.

### 🔔 Monitor new content

For scheduled creator, hashtag, or campaign monitoring:

1. Keep `dedupe` enabled.
2. Schedule the Actor at the interval you need.
3. Pass the previous run time as `onlyNewerThan`.
4. Save the latest successful timestamp for the next run.

Posts at or before that timestamp are skipped before they enter the paid output.

### 🧯 Issues and empty sources

The separate **Issues** dataset records a clear reason for inputs that cannot produce a paid result, including:

- deleted, private, or unavailable posts
- empty or private profiles
- queries with no matching public videos
- temporary source or connection failures after retries

An issue row never replaces a real result in the default dataset.

### ❓ FAQ

**Can I mix all source types in one run?**\
Yes. The global limit and deduplication apply across all sources.

**Does hashtag mode return unrelated videos?**\
No. Each full video record is checked for the requested hashtag before it is saved.

**Does profile mode return the creator's entire history?**\
Not always. It returns the authoritative recent embed posts and can expand far beyond that window when TikTok publicly indexes the creator's older content. Private, deleted, and non-indexed history is not accessible through the request-only public surfaces.

**Is Trending my personal For You feed?**\
No. It is a reproducible public trend dataset built from TikTok's public trending playlist, public discovery topics, and Creative Center. It does not impersonate a logged-in user's personalized feed.

**Are transcripts generated for every video?**\
No. Native transcript mode requires a caption track published or generated by TikTok. The video result is still returned when no captions exist.

**Do direct media URLs last forever?**\
TikTok CDN URLs may expire. Enable video or cover downloads when you need durable files in Apify storage.

**Do failed inputs count as paid video results?**\
No. Only complete rows written to the default video dataset are results; issues are kept separately.

# Actor input Schema

## `postUrls` (type: `array`):

Add full TikTok post URLs or short vm.tiktok.com links.

## `postIds` (type: `array`):

Optional bare numeric TikTok video IDs, one per row.

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

Creator usernames or profile URLs, for example @scout2015.

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

Hashtags with or without #. Results are verified to contain the requested hashtag.

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

Topics, products, people, or phrases to find in public TikTok videos.

## `trending` (type: `boolean`):

Combine TikTok's public trending playlist, public trend discovery, and Creative Center ranking signals.

## `trendCountry` (type: `string`):

Country used for Creative Center ranking signals. Public discovery results remain global.

## `deepDiscovery` (type: `boolean`):

Expand profiles through creator-owned topics and expand search, hashtags, and trends through TikTok's related public feeds. Exact author and hashtag checks still apply.

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

Global cap across all selected sources. Use 0 for source safety limits (50 profile posts, 100 search/hashtag posts, and 50 trends per input).

## `dedupe` (type: `boolean`):

Save each video ID only once, even when it appears in several selected sources.

## `shouldDownloadVideos` (type: `boolean`):

Save available no-watermark MP4 files in the run key-value store and add permanent storage links to results.

## `shouldDownloadCovers` (type: `boolean`):

Save each thumbnail in the run key-value store and add a permanent storage link.

## `transcript` (type: `string`):

Extract TikTok's native creator or auto-generated captions as readable text when available.

## `transcriptLanguage` (type: `string`):

Optional language code such as eng, rus, spa, or deu. Leave empty to prefer the original language.

## `onlyNewerThan` (type: `integer`):

Optional Unix timestamp in seconds. Posts at or before this time are skipped, which is useful for scheduled monitoring.

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

The default configuration is tuned for reliable TikTok access. Change it only when you have a specific proxy requirement.

## `maxConcurrency` (type: `integer`):

Number of video detail requests processed at once.

## `maxRetries` (type: `integer`):

Retries for a temporarily unavailable video page.

## `listMaxRetries` (type: `integer`):

Retries for profile, hashtag, search, and trend discovery requests.

## `maxDiscoveryQueries` (type: `integer`):

Maximum number of first-party TikTok topic feeds scanned per list input. Raise this only for runs that need hundreds of results.

## `requestTimeoutSecs` (type: `integer`):

Maximum time for one network request.

## Actor input object example

```json
{
  "postUrls": [
    {
      "url": "https://www.tiktok.com/@apifyoffice/video/7200360993149553925"
    }
  ],
  "trending": false,
  "trendCountry": "US",
  "deepDiscovery": true,
  "maxItems": 20,
  "dedupe": true,
  "shouldDownloadVideos": false,
  "shouldDownloadCovers": false,
  "transcript": "never",
  "onlyNewerThan": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 5,
  "maxRetries": 4,
  "listMaxRetries": 4,
  "maxDiscoveryQueries": 12,
  "requestTimeoutSecs": 25
}
```

# Actor output Schema

## `videos` (type: `string`):

No description

## `engagement` (type: `string`):

No description

## `creators` (type: `string`):

No description

## `media` (type: `string`):

No description

## `transcripts` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

# 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 = {
    "postUrls": [
        {
            "url": "https://www.tiktok.com/@apifyoffice/video/7200360993149553925"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("trakk/tiktok-video-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 = { "postUrls": [{ "url": "https://www.tiktok.com/@apifyoffice/video/7200360993149553925" }] }

# Run the Actor and wait for it to finish
run = client.actor("trakk/tiktok-video-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 '{
  "postUrls": [
    {
      "url": "https://www.tiktok.com/@apifyoffice/video/7200360993149553925"
    }
  ]
}' |
apify call trakk/tiktok-video-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "TikTok Video Scraper",
        "description": "Scrape TikTok videos from URLs, profiles, hashtags, keyword search, or trends — one rich record each: engagement stats, author, music, hashtags, no-watermark download and native transcript. Fast, HTTP-only, and you are never charged for unavailable or unmatched videos.",
        "version": "0.2",
        "x-build-id": "LfmqA3AroYfAhZQ1g"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/trakk~tiktok-video-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-trakk-tiktok-video-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/trakk~tiktok-video-scraper/runs": {
            "post": {
                "operationId": "runs-sync-trakk-tiktok-video-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/trakk~tiktok-video-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-trakk-tiktok-video-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": {
                    "postUrls": {
                        "title": "🎬 Video or photo URLs",
                        "type": "array",
                        "description": "Add full TikTok post URLs or short vm.tiktok.com links.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "postIds": {
                        "title": "🔢 Video IDs",
                        "type": "array",
                        "description": "Optional bare numeric TikTok video IDs, one per row.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "profiles": {
                        "title": "👤 Creator profiles",
                        "type": "array",
                        "description": "Creator usernames or profile URLs, for example @scout2015.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "hashtags": {
                        "title": "#️⃣ Hashtags",
                        "type": "array",
                        "description": "Hashtags with or without #. Results are verified to contain the requested hashtag.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchQueries": {
                        "title": "🔎 Keyword searches",
                        "type": "array",
                        "description": "Topics, products, people, or phrases to find in public TikTok videos.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "trending": {
                        "title": "🔥 Current trending videos",
                        "type": "boolean",
                        "description": "Combine TikTok's public trending playlist, public trend discovery, and Creative Center ranking signals.",
                        "default": false
                    },
                    "trendCountry": {
                        "title": "🌍 Trend country",
                        "enum": [
                            "US",
                            "GB",
                            "DE",
                            "FR",
                            "IT",
                            "ES",
                            "CA",
                            "AU",
                            "BR",
                            "MX",
                            "JP",
                            "KR",
                            "ID"
                        ],
                        "type": "string",
                        "description": "Country used for Creative Center ranking signals. Public discovery results remain global.",
                        "default": "US"
                    },
                    "deepDiscovery": {
                        "title": "🧭 Deep list discovery",
                        "type": "boolean",
                        "description": "Expand profiles through creator-owned topics and expand search, hashtags, and trends through TikTok's related public feeds. Exact author and hashtag checks still apply.",
                        "default": true
                    },
                    "maxItems": {
                        "title": "📦 Maximum results",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Global cap across all selected sources. Use 0 for source safety limits (50 profile posts, 100 search/hashtag posts, and 50 trends per input).",
                        "default": 20
                    },
                    "dedupe": {
                        "title": "Remove duplicate videos",
                        "type": "boolean",
                        "description": "Save each video ID only once, even when it appears in several selected sources.",
                        "default": true
                    },
                    "shouldDownloadVideos": {
                        "title": "⬇️ Download video files ($)",
                        "type": "boolean",
                        "description": "Save available no-watermark MP4 files in the run key-value store and add permanent storage links to results.",
                        "default": false
                    },
                    "shouldDownloadCovers": {
                        "title": "🖼️ Download cover images",
                        "type": "boolean",
                        "description": "Save each thumbnail in the run key-value store and add a permanent storage link.",
                        "default": false
                    },
                    "transcript": {
                        "title": "📝 Spoken-word transcript",
                        "enum": [
                            "never",
                            "native"
                        ],
                        "type": "string",
                        "description": "Extract TikTok's native creator or auto-generated captions as readable text when available.",
                        "default": "never"
                    },
                    "transcriptLanguage": {
                        "title": "Preferred transcript language",
                        "type": "string",
                        "description": "Optional language code such as eng, rus, spa, or deu. Leave empty to prefer the original language."
                    },
                    "onlyNewerThan": {
                        "title": "⏱️ Only posts newer than",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Optional Unix timestamp in seconds. Posts at or before this time are skipped, which is useful for scheduled monitoring.",
                        "default": 0
                    },
                    "proxyConfiguration": {
                        "title": "🌐 Connection settings",
                        "type": "object",
                        "description": "The default configuration is tuned for reliable TikTok access. Change it only when you have a specific proxy requirement.",
                        "default": {
                            "useApifyProxy": true
                        }
                    },
                    "maxConcurrency": {
                        "title": "Parallel requests",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Number of video detail requests processed at once.",
                        "default": 5
                    },
                    "maxRetries": {
                        "title": "Video retries",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Retries for a temporarily unavailable video page.",
                        "default": 4
                    },
                    "listMaxRetries": {
                        "title": "List source retries",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Retries for profile, hashtag, search, and trend discovery requests.",
                        "default": 4
                    },
                    "maxDiscoveryQueries": {
                        "title": "Deep discovery query budget",
                        "minimum": 1,
                        "maximum": 30,
                        "type": "integer",
                        "description": "Maximum number of first-party TikTok topic feeds scanned per list input. Raise this only for runs that need hundreds of results.",
                        "default": 12
                    },
                    "requestTimeoutSecs": {
                        "title": "Request timeout",
                        "minimum": 5,
                        "maximum": 120,
                        "type": "integer",
                        "description": "Maximum time for one network request.",
                        "default": 25
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
