# TikTok Scraper: Videos, Profiles, Hashtags & Music Data (`scrapemint/tiktok-scraper`) Actor

Scrape TikTok by hashtag, profile, search query, or direct video URL. Returns plays, likes, shares, saves, comments, follower counts, hearts, music title, and captions. Optional video file and subtitle downloads. JSON output. Pay per video.

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

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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 Scraper: Videos, Profiles, Hashtags & Music Data to JSON

Scrape TikTok without an API key. Pull plays, likes, shares, saves, follower counts, hearts, captions, hashtags, and music from any TikTok video, creator profile, hashtag, or search. One JSON row per item. Pay only for what you keep.

**Ranks for:** TikTok scraper, TikTok API alternative, TikTok API free, scrape TikTok videos, TikTok data export, TikTok profile scraper, TikTok follower count API, TikTok hashtag tracker, TikTok trend monitor, TikTok video downloader, TikTok music search, TikTok creator stats, TikTok to CSV, TikTok to JSON.

---

### How it works

```mermaid
flowchart LR
    A[Video URL<br/>Profile<br/>Hashtag<br/>Search] --> B[Open in<br/>headless Chromium]
    B --> C[Scroll feed,<br/>collect video URLs]
    C --> D[Open each video]
    D --> E[Parse embedded<br/>JSON state]
    E --> F[Push row<br/>to dataset]
    F --> G[(JSON, CSV,<br/>Excel, API)]
````

Feed the actor a hashtag, a handle, a search query, or a direct video URL. The actor walks the page, extracts the embedded rehydration state, and returns one clean row per video and per profile.

***

### What works today

| Input | Status | What you get |
|---|---|---|
| `videoUrls` | Reliable | Full stats, author, music, hashtags, download URL. |
| `profiles` | Reliable | Profile row (followers, hearts, bio) plus recent videos. |
| `hashtags` | Limited | TikTok restricts anonymous hashtag browsing. Expect few or no results without a session. |
| `searchQueries` | Limited | TikTok redirects anonymous search to the For You feed. Limited results without a session. |

> **Best practice:** scrape a list of profiles first, collect the returned video URLs, then run the actor again with `videoUrls` for full stats. Diagram below.

***

### Recommended workflow

```mermaid
flowchart LR
    A[List of creators] --> B[Run with<br/>profiles input]
    B --> C[Profile rows +<br/>recent video URLs]
    C --> D[Run again with<br/>videoUrls input]
    D --> E[Rich per video<br/>stats and music]
```

Two runs. First pulls recent URLs per creator. Second returns the full stat sheet per video. Cheap, reliable, scales to thousands of creators.

***

### Quick start

**Creator stats and recent videos:**

```json
{
  "profiles": ["gordonramsayofficial", "khaby.lame"],
  "resultsPerPage": 30
}
```

**Single video deep dive:**

```json
{
  "videoUrls": [
    "https://www.tiktok.com/@gordonramsayofficial/video/7341108653442829601"
  ],
  "scrapeComments": true,
  "maxCommentsPerVideo": 100
}
```

**Bulk video stat refresh (campaign measurement):**

```json
{
  "videoUrls": [
    "https://www.tiktok.com/@creator_a/video/7000000000000000001",
    "https://www.tiktok.com/@creator_b/video/7000000000000000002"
  ],
  "dedupe": false
}
```

***

### Sample output

Per video row:

```json
{
  "type": "video",
  "id": "7341108653442829601",
  "url": "https://www.tiktok.com/@gordonramsayofficial/video/7341108653442829601",
  "text": "Its curry in a hurry from #NextLevelKitchen !",
  "createTime": "2024-02-29T19:31:02.000Z",
  "duration": 87,
  "cover": "https://p19-common-sign-useastred.tiktokcdn-eu.com/...",
  "authorUsername": "gordonramsayofficial",
  "authorNickname": "Gordon Ramsay",
  "authorVerified": true,
  "authorFollowers": 40900000,
  "authorHearts": 727100000,
  "authorVideoCount": 686,
  "plays": 26900000,
  "likes": 1900000,
  "comments": 14400,
  "shares": 101200,
  "saves": 474125,
  "hashtags": ["nextlevelkitchen"],
  "musicId": "7341108705247382305",
  "musicTitle": "original sound",
  "musicAuthor": "Gordon Ramsay",
  "musicOriginal": true,
  "downloadAddr": "https://v16-webapp-prime.tiktok.com/video/...mp4"
}
```

Per profile row:

```json
{
  "type": "profile",
  "id": "6747935906352907269",
  "username": "gordonramsayofficial",
  "nickname": "Gordon Ramsay",
  "verified": true,
  "signature": "I cook sometimes too.....",
  "followers": 40900000,
  "following": 571,
  "hearts": 727100000,
  "videoCount": 686
}
```

***

### What you get back

```mermaid
flowchart LR
    V[Video row] --> V1[Stats<br/>plays, likes,<br/>comments, shares,<br/>saves]
    V --> V2[Author<br/>username, nickname,<br/>followers, hearts,<br/>verified]
    V --> V3[Music<br/>id, title,<br/>author, original]
    V --> V4[Content<br/>caption, hashtags,<br/>cover, duration]
    V --> V5[Downloads<br/>video MP4 URL,<br/>subtitles]
```

Every row is self contained. No joins required.

***

### Who uses this

| Role | Use case |
|---|---|
| Brand marketer | Measure branded hashtag reach and UGC volume. |
| Talent agency | Rank creators by followers, engagement, and video cadence. |
| Trend researcher | Surface rising videos for a topic, sound, or niche. |
| Music label | Track sound usage and top remix creators. |
| Social listening team | Feed TikTok signals into sentiment and share of voice models. |
| Ad buyer | Validate creator reach and average plays before paying for a sponsorship. |
| Affiliate marketer | Find high intent videos in a product category for outreach. |

***

### Input reference

| Field | Type | Purpose |
|---|---|---|
| `videoUrls` | string\[] | Direct video URLs. Most reliable source. |
| `profiles` | string\[] | Usernames or profile URLs. |
| `hashtags` | string\[] | Hashtag names, with or without `#`. |
| `searchQueries` | string\[] | Keyword searches. |
| `resultsPerPage` | integer | Cap per source. Default 100. |
| `profileScrapeSections` | enum | `videos`, `reposts`, `liked`, `favorites`. |
| `searchSection` | enum | `top`, `videos`, `users`, `live`. |
| `downloadVideos` | boolean | Save MP4s and include a download URL per row. |
| `downloadSubtitles` | boolean | Extract auto captions. Paid add on. |
| `subtitleLanguages` | string\[] | Preferred language codes, first match wins. |
| `scrapeComments` | boolean | Collect top comments per video. Paid add on. |
| `maxCommentsPerVideo` | integer | Cap on comments per video. |
| `countryCode` | string | Two letter ISO code. Changes geo ranking. Paid add on. |
| `dedupe` | boolean | Skip IDs already pushed in previous runs. |
| `maxVideosTotal` | integer | Hard cap across all sources. Default 500. |
| `proxyConfiguration` | object | Apify proxy. Residential recommended. |

***

### API example

Call the actor from any backend. Swap in your Apify user and token.

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/YOUR_USER~tiktok-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "profiles": ["gordonramsayofficial"],
    "resultsPerPage": 30
  }'
```

Poll the run, read the dataset. Or use the Apify client SDK in Node, Python, or PHP.

***

### TikTok scraper alternatives compared

|  | Official TikTok Research API | Custom scraper | **This actor** |
|---|---|---|---|
| Access | Gated, academic email | Self hosted maintenance | Anyone with an Apify account |
| Setup time | Weeks of approval | Days of coding | 60 seconds |
| Video stats | Yes | Yes if you code it | Yes out of the box |
| Creator stats | Limited | Yes if you code it | Yes out of the box |
| Music data | No | Yes if you code it | Yes out of the box |
| Video MP4 download | No | Yes if you code it | Yes, toggle on |
| Proxy and anti block | Your problem | Your problem | Handled |
| Pricing | N/A | Proxy + server bill | Pay per video row |

***

### Pricing

First 10 videos per run are free so you can test the output before paying. After that you pay per video row. Profile rows, music fields, and hashtag arrays ride along at no extra cost. Subtitles, comments, and country filter are paid add ons billed per row when enabled.

***

### FAQ

**Is there a free TikTok API?**
TikTok's own Research API is gated to approved academics. This actor gives anyone public TikTok data with a pay per use model, no API key required.

**How do I scrape TikTok without an API key?**
Pick a profile or a direct video URL, drop it in the input, hit Start. The actor handles headless Chromium, fingerprint rotation, and residential proxy for you.

**Can I download TikTok videos as MP4?**
Yes. Turn on `downloadVideos`. Each row includes a `downloadAddr` link to the source MP4.

**How accurate are TikTok follower counts?**
The counts come straight from TikTok's rendered profile response, same numbers a visitor sees in the web app. Accurate at the moment of the scrape.

**Does it return TikTok comments?**
Yes. Enable `scrapeComments` and set `maxCommentsPerVideo`. The actor opens the comment drawer on each video and pulls the top comments.

**Can I get TikTok video transcripts or subtitles?**
Yes. Enable `downloadSubtitles` and list preferred languages. The actor returns the caption track URL and language code when TikTok has auto captions available.

**Does it work for private accounts?**
No. Only public profiles, hashtags, and videos.

**Why do hashtag runs sometimes return zero videos?**
TikTok restricts anonymous hashtag browsing. Use `profiles` or `videoUrls` for reliable output. See the recommended workflow above.

**Can I run this on a schedule?**
Yes. Use the Apify scheduler to run the actor hourly, daily, or weekly. Turn `dedupe` off if you want a fresh snapshot each run for trend tracking.

**Does it work in any country?**
Set `countryCode` to the two letter ISO code. The actor matches the proxy locale and returns results as they appear to viewers in that country.

**Is scraping TikTok allowed?**
This actor reads public HTML that any web visitor can see. Respect TikTok's terms and rate limit sensibly. Do not store or redistribute content you do not have the right to use.

***

### Related actors

- **Reddit Brand Monitor & Lead Finder** for subreddit mentions and high intent leads
- **Google Maps Scraper** for local business data and reviews
- **TripAdvisor Review Intelligence** for hotel and restaurant review monitoring
- **Yelp Review Intelligence** for local service reviews
- **Amazon Review Intelligence** for product review tracking
- **Zillow Home Price Scraper** for real estate listings and price history

# Actor input Schema

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

TikTok hashtags to scrape. Enter without the # symbol. TikTok is restricting anonymous hashtag browsing, so hashtag runs may return 0 videos without a logged session. Profile and direct video URL inputs are the most reliable.

## `resultsPerPage` (type: `integer`):

Cap on how many videos are returned per source. Larger numbers take longer and cost more.

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

TikTok usernames or profile URLs. Returns profile stats plus recent videos. Enter with or without @.

## `profileScrapeSections` (type: `string`):

Which profile tab to scrape when a profile is supplied.

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

Keyword searches to run on TikTok. TikTok redirects anonymous searches to the For You feed, so search runs may return 0 videos without a logged session. Profile and direct video URL inputs are the most reliable.

## `searchSection` (type: `string`):

Which search tab to scrape.

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

Direct TikTok video URLs to scrape without running a search. Example: https://www.tiktok.com/@user/video/1234567890.

## `downloadVideos` (type: `boolean`):

Save each video as an MP4 file to the key value store and include a public link in the output row. Adds storage cost.

## `downloadSubtitles` (type: `boolean`):

Extract auto generated captions or transcribe audio when captions are missing. Paid feature.

## `subtitleLanguages` (type: `array`):

Preferred subtitle language codes. First match wins. Example: en, es, fr.

## `scrapeComments` (type: `boolean`):

Open each video and collect the top comments. Paid feature.

## `maxCommentsPerVideo` (type: `integer`):

Cap on comments returned per video. 0 disables.

## `countryCode` (type: `string`):

Return results as they appear to a viewer in this country. Two letter ISO code. Leave blank for default. Paid feature when set.

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

Skip video IDs already pushed in previous runs. Turn off to track changes to the same video over time.

## `maxVideosTotal` (type: `integer`):

Hard cap across all sources. Controls total cost.

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

Apify proxy. Residential strongly recommended. TikTok blocks datacenter IPs.

## Actor input object example

```json
{
  "hashtags": [],
  "resultsPerPage": 100,
  "profiles": [],
  "profileScrapeSections": "videos",
  "searchQueries": [],
  "searchSection": "videos",
  "videoUrls": [],
  "downloadVideos": false,
  "downloadSubtitles": false,
  "subtitleLanguages": [
    "en"
  ],
  "scrapeComments": false,
  "maxCommentsPerVideo": 0,
  "countryCode": "",
  "dedupe": true,
  "maxVideosTotal": 500,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapemint/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 = { "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    } }

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "TikTok Scraper: Videos, Profiles, Hashtags & Music Data",
        "description": "Scrape TikTok by hashtag, profile, search query, or direct video URL. Returns plays, likes, shares, saves, comments, follower counts, hearts, music title, and captions. Optional video file and subtitle downloads. JSON output. Pay per video.",
        "version": "0.1",
        "x-build-id": "qJQXqNBbJnjrMlhSb"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scrapemint~tiktok-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scrapemint-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/scrapemint~tiktok-scraper/runs": {
            "post": {
                "operationId": "runs-sync-scrapemint-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/scrapemint~tiktok-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-scrapemint-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": {
                    "hashtags": {
                        "title": "Videos with this hashtag",
                        "type": "array",
                        "description": "TikTok hashtags to scrape. Enter without the # symbol. TikTok is restricting anonymous hashtag browsing, so hashtag runs may return 0 videos without a logged session. Profile and direct video URL inputs are the most reliable.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "resultsPerPage": {
                        "title": "Number of videos per hashtag, profile or search",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Cap on how many videos are returned per source. Larger numbers take longer and cost more.",
                        "default": 100
                    },
                    "profiles": {
                        "title": "TikTok profiles data",
                        "type": "array",
                        "description": "TikTok usernames or profile URLs. Returns profile stats plus recent videos. Enter with or without @.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "profileScrapeSections": {
                        "title": "Profile sections",
                        "enum": [
                            "videos",
                            "reposts",
                            "liked",
                            "favorites"
                        ],
                        "type": "string",
                        "description": "Which profile tab to scrape when a profile is supplied.",
                        "default": "videos"
                    },
                    "searchQueries": {
                        "title": "Search",
                        "type": "array",
                        "description": "Keyword searches to run on TikTok. TikTok redirects anonymous searches to the For You feed, so search runs may return 0 videos without a logged session. Profile and direct video URL inputs are the most reliable.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchSection": {
                        "title": "Search section",
                        "enum": [
                            "top",
                            "videos",
                            "users",
                            "live"
                        ],
                        "type": "string",
                        "description": "Which search tab to scrape.",
                        "default": "videos"
                    },
                    "videoUrls": {
                        "title": "Video URLs",
                        "type": "array",
                        "description": "Direct TikTok video URLs to scrape without running a search. Example: https://www.tiktok.com/@user/video/1234567890.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "downloadVideos": {
                        "title": "Download TikTok videos",
                        "type": "boolean",
                        "description": "Save each video as an MP4 file to the key value store and include a public link in the output row. Adds storage cost.",
                        "default": false
                    },
                    "downloadSubtitles": {
                        "title": "Download TikTok subtitles or transcription ($)",
                        "type": "boolean",
                        "description": "Extract auto generated captions or transcribe audio when captions are missing. Paid feature.",
                        "default": false
                    },
                    "subtitleLanguages": {
                        "title": "Subtitle languages",
                        "type": "array",
                        "description": "Preferred subtitle language codes. First match wins. Example: en, es, fr.",
                        "default": [
                            "en"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "scrapeComments": {
                        "title": "TikTok comments ($)",
                        "type": "boolean",
                        "description": "Open each video and collect the top comments. Paid feature.",
                        "default": false
                    },
                    "maxCommentsPerVideo": {
                        "title": "Max comments per video",
                        "minimum": 0,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Cap on comments returned per video. 0 disables.",
                        "default": 0
                    },
                    "countryCode": {
                        "title": "Scrape as in a country filter ($)",
                        "type": "string",
                        "description": "Return results as they appear to a viewer in this country. Two letter ISO code. Leave blank for default. Paid feature when set.",
                        "default": ""
                    },
                    "dedupe": {
                        "title": "Deduplicate across runs",
                        "type": "boolean",
                        "description": "Skip video IDs already pushed in previous runs. Turn off to track changes to the same video over time.",
                        "default": true
                    },
                    "maxVideosTotal": {
                        "title": "Max videos per run",
                        "minimum": 1,
                        "maximum": 50000,
                        "type": "integer",
                        "description": "Hard cap across all sources. Controls total cost.",
                        "default": 500
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify proxy. Residential strongly recommended. TikTok blocks datacenter IPs.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
