# TikTok Ad Library Scraper - Fast & Reliable (`whoareyouanas/tiktok-ad-scraper`) Actor

Scrape TikTok ads in seconds. Extract ad creatives, video URLs, targeting data (age, gender), reach estimates, advertiser info, and "paid for by" details from the TikTok Ad Library. Ideal for ad intelligence, competitor research, and marketing analytics. Clean JSON output.

- **URL**: https://apify.com/whoareyouanas/tiktok-ad-scraper.md
- **Developed by:** [Anas Nadeem](https://apify.com/whoareyouanas) (community)
- **Categories:** Social media, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 ad 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

## TikTok Ad Library & Creative Center Scraper

The most comprehensive TikTok ad intelligence scraper on Apify. Extract ads, creatives, targeting data, and performance metrics from **both** TikTok Ad Library (EU/EEA) and Creative Center (50+ countries globally) in a single actor.

### What does this scraper do?

This scraper extracts advertising data from TikTok's two public ad data sources:

- **TikTok Ad Library** (`library.tiktok.com`) — EU/EEA mandated transparency data with advertiser info, targeting demographics, reach estimates, and ad creatives
- **TikTok Creative Center** (`ads.tiktok.com`) — Global top-performing ads with performance metrics like CTR, view rates, likes, and conversion data

No TikTok account or API key required. All data comes from publicly accessible sources.

### Why use this scraper?

- **Dual-source coverage** — The only scraper that combines both Ad Library and Creative Center in one tool
- **Global reach** — Creative Center covers 50+ countries including US, Japan, Brazil, India, and more
- **Rich targeting data** — Ad Library provides gender, age, interest, and geographic targeting breakdowns
- **Performance metrics** — Creative Center includes CTR, 2s/6s view rates, conversion rates, and likes
- **Quick Search mode** — Fast, cheap scraping for large-volume data collection
- **Full mode** — Detailed enrichment with targeting and reach data per ad
- **Proxy support** — Works with Apify Residential proxy and external providers (BrightData, Oxylabs)
- **Pay-per-result pricing** — Only pay for the ads you scrape, no subscriptions

### Features

- Search by keyword, advertiser name, or advertiser business ID
- Filter by country, industry, campaign objective, time period
- Sort by date, reach, CTR, likes
- Quick Search (search-level data only) or Full mode (with targeting enrichment)
- Automatic pagination — scrapes all available results up to your limit
- Timeout resilience — partial results are saved even if the scraper times out
- Clean, structured JSON output ready for analysis

### How much does it cost to scrape TikTok ads?

This scraper uses **pay-per-result** pricing:

| Mode | Price per ad | Best for |
|------|-------------|----------|
| Quick Search | ~$0.005 | Large-volume competitive research |
| Full Mode | ~$0.015 | Detailed targeting and reach analysis |

**Example:** Scraping 1,000 ads in Quick Search mode costs approximately $5.00.

Platform compute costs are separate and depend on your proxy configuration and scraping speed.

### Input

#### Option A: Direct URL

Paste a URL directly from `library.tiktok.com` or `ads.tiktok.com/business/creativecenter`:

```json
{
    "targetUrl": "https://library.tiktok.com/ads?query=nike&region=DE",
    "maxResults": 100
}
````

#### Option B: Build from Parameters

Configure search parameters:

```json
{
    "scrapeMode": "ad_library",
    "searchQuery": "nike",
    "country": "DE",
    "quickSearch": false,
    "maxResults": 100
}
```

#### Creative Center (Global)

```json
{
    "scrapeMode": "creative_center",
    "searchQuery": "gaming",
    "country": "US",
    "industry": "games",
    "objective": "app_install",
    "timePeriod": "30",
    "maxResults": 50
}
```

#### Both Sources

```json
{
    "scrapeMode": "both",
    "searchQuery": "shopify",
    "country": "DE",
    "maxResults": 100
}
```

### Output

Each scraped ad is returned as a structured JSON object:

```json
{
    "adId": "12345678",
    "advertiserName": "Nike",
    "advertiserBusinessId": "987654321",
    "advertiserLocation": "US",
    "videoUrl": "https://v16m.tiktokcdn.com/...",
    "videoUrlHd": "https://v16m.tiktokcdn.com/...",
    "coverImageUrl": "https://p16-sign.tiktokcdn.com/...",
    "adCopy": "Just Do It. Shop the latest Nike collection.",
    "firstShownDate": "2025-01-15",
    "lastShownDate": "2025-03-20",
    "status": "active",
    "estimatedAudience": "500K-1M",
    "estimatedAudienceMin": 500000,
    "estimatedAudienceMax": 1000000,
    "reachByCountry": { "DE": 250000, "FR": 150000, "IT": 100000 },
    "targetGender": ["FEMALE", "MALE"],
    "targetAgeRange": ["18-24", "25-34"],
    "targetCountries": ["DE", "FR", "IT"],
    "targetInterests": ["Sports", "Fashion"],
    "likes": 15000,
    "ctr": 2.5,
    "viewRate2s": 45.2,
    "viewRate6s": 28.7,
    "industry": "Apparel & Accessories",
    "campaignObjective": "Traffic",
    "adFormat": "Single Video",
    "source": "ad_library",
    "sourceUrl": "https://library.tiktok.com/ads?id=12345678",
    "scrapeDate": "2025-03-28T10:00:00.000Z"
}
```

Output is available as JSON, CSV, Excel, XML, HTML, and RSS.

### Ad Library vs Creative Center

| Feature | Ad Library | Creative Center |
|---------|-----------|-----------------|
| Coverage | EU/EEA + UK + CH | 50+ countries globally |
| Targeting data | Yes (gender, age, interests) | No |
| Reach estimates | Yes (per country) | No |
| Performance metrics | No | Yes (CTR, view rates, CVR) |
| Ad copy | Sometimes | No |
| Video creatives | Yes | Yes |
| Advertiser details | Full (name, location, funder) | Partial (brand name) |
| Data freshness | Within 24 hours | Periodically updated |
| Result cap | ~3,600 per query | Varies |

### Tips for best results

1. **Use residential proxies** — TikTok blocks datacenter IPs aggressively. Configure your Apify Residential proxy for reliable results.
2. **Start with Quick Search** — Use Quick Search mode first to verify data availability before running Full mode.
3. **Split large queries** — If you need more than 3,600 results from the Ad Library, run multiple queries with different country/date filters.
4. **Ad Library is EU-only** — If you need US/Asia data, use Creative Center mode or "Both" mode.
5. **Check date ranges** — Ad Library retains ads for 1 year after last shown. Older ads may not be available.

### Supported countries

**Ad Library (EU/EEA):** Austria, Belgium, Bulgaria, Croatia, Cyprus, Czech Republic, Denmark, Estonia, Finland, France, Germany, Greece, Hungary, Ireland, Italy, Latvia, Lithuania, Luxembourg, Malta, Netherlands, Poland, Portugal, Romania, Slovakia, Slovenia, Spain, Sweden, United Kingdom, Switzerland, Norway, Iceland, Liechtenstein

**Creative Center (Global):** All EU countries plus United States, Canada, Japan, South Korea, Australia, Brazil, Mexico, India, Indonesia, Thailand, Vietnam, Philippines, Malaysia, Singapore, Taiwan, Argentina, Chile, Colombia, Peru, Egypt, Saudi Arabia, UAE, Turkey, South Africa, Nigeria, Kenya, and more.

### FAQ

**Is this scraper legal?**
This scraper only accesses publicly available data. The TikTok Ad Library is mandated by the EU Digital Services Act (DSA) for transparency purposes. The Creative Center is a public tool provided by TikTok for advertisers. Always comply with applicable data protection laws (GDPR, etc.) when using scraped data.

**Why am I getting no results?**
Most commonly: (1) No proxy configured — TikTok blocks datacenter IPs, (2) Using a non-EU country with Ad Library mode — switch to Creative Center, (3) The search query is too specific — try broader terms.

**What's the difference between Quick Search and Full mode?**
Quick Search returns search-result-level data (ad ID, advertiser, dates, estimated audience). Full mode additionally visits each ad's detail page to extract targeting demographics, reach breakdowns, and additional metadata. Full mode is slower and costs more per ad.

**Can I scrape US TikTok ads?**
Yes, using Creative Center mode. The Ad Library currently only covers EU/EEA countries. Set `scrapeMode: "creative_center"` and `country: "US"`.

### Other scrapers you might like

- [Meta (Facebook) Ad Library Scraper](https://apify.com/whoareyouanas/meta-ad-scraper) — Scrape ads from Facebook, Instagram, WhatsApp, and Messenger

### Legal disclaimer

This scraper accesses publicly available data from TikTok's Ad Library and Creative Center. Users are responsible for ensuring their use of this tool and the resulting data complies with all applicable laws, regulations, and TikTok's Terms of Service. The developer assumes no liability for misuse of this tool.

# Actor input Schema

## `scrapeMode` (type: `string`):

Choose which TikTok data source to scrape. Ad Library covers EU/EEA with rich targeting data. Creative Center covers 50+ countries globally with performance metrics. 'Both' runs both sources.

## `targetUrl` (type: `string`):

Paste a TikTok Ad Library or Creative Center URL directly. If provided, all parameter fields below are ignored.

## `searchQuery` (type: `string`):

Keyword or advertiser name to search for (e.g. 'nike', 'shopify', 'gaming app').

## `advertiserId` (type: `string`):

TikTok advertiser business ID to look up all ads from a specific advertiser.

## `country` (type: `string`):

Country code for filtering. For Ad Library: EU/EEA countries only (e.g. DE, FR, IT, ES, NL, GB). For Creative Center: any of 50+ countries (e.g. US, JP, BR, IN).

## `industry` (type: `string`):

Filter by industry vertical. Only applies to Creative Center mode.

## `objective` (type: `string`):

Filter by campaign objective. Only applies to Creative Center mode.

## `timePeriod` (type: `string`):

Time window for results. For Ad Library: custom date range via startDate/endDate. For Creative Center: preset windows.

## `startDate` (type: `string`):

Start date for Ad Library search in YYYY-MM-DD format. Defaults to 1 year ago.

## `endDate` (type: `string`):

End date for Ad Library search in YYYY-MM-DD format. Defaults to today.

## `sortBy` (type: `string`):

Sort order for results.

## `quickSearch` (type: `boolean`):

If enabled, skips detail page visits for faster, cheaper scraping. Returns search-level fields only (no targeting or detailed reach data). Recommended for large-volume scrapes.

## `maxResults` (type: `integer`):

Maximum number of ads to return. Set to 0 for unlimited. Ad Library has a platform cap of ~3,600 results per query.

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

Number of parallel requests. Keep at 1 for stability. Increase to 2-3 only if you need faster scraping.

## `requestHandlerTimeoutSecs` (type: `integer`):

Maximum time to wait for scraping to complete per page.

## `proxyUrl` (type: `string`):

Residential proxy URL for reliable scraping. Format: http://groups-RESIDENTIAL:YOUR\_APIFY\_TOKEN@proxy.apify.com:8000. TikTok aggressively blocks datacenter IPs. External proxies (BrightData, Oxylabs) also supported.

## Actor input object example

```json
{
  "scrapeMode": "ad_library",
  "searchQuery": "nike",
  "country": "all",
  "industry": "all",
  "objective": "all",
  "timePeriod": "30",
  "sortBy": "last_shown_date_newest",
  "quickSearch": false,
  "maxResults": 100,
  "maxConcurrency": 1,
  "requestHandlerTimeoutSecs": 300
}
```

# Actor output Schema

## `overview` (type: `string`):

Overview of all scraped ads with key metrics and details

## `allAds` (type: `string`):

Complete dataset with all fields including targeting, reach, and creative assets

# 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 = {
    "searchQuery": "nike",
    "maxResults": 100,
    "maxConcurrency": 1,
    "requestHandlerTimeoutSecs": 300
};

// Run the Actor and wait for it to finish
const run = await client.actor("whoareyouanas/tiktok-ad-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 = {
    "searchQuery": "nike",
    "maxResults": 100,
    "maxConcurrency": 1,
    "requestHandlerTimeoutSecs": 300,
}

# Run the Actor and wait for it to finish
run = client.actor("whoareyouanas/tiktok-ad-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 '{
  "searchQuery": "nike",
  "maxResults": 100,
  "maxConcurrency": 1,
  "requestHandlerTimeoutSecs": 300
}' |
apify call whoareyouanas/tiktok-ad-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "TikTok Ad Library Scraper - Fast & Reliable",
        "description": "Scrape TikTok ads in seconds. Extract ad creatives, video URLs, targeting data (age, gender), reach estimates, advertiser info, and \"paid for by\" details from the TikTok Ad Library. Ideal for ad intelligence, competitor research, and marketing analytics. Clean JSON output.",
        "version": "0.0",
        "x-build-id": "QQ5f2AVbGnm7i4pyu"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/whoareyouanas~tiktok-ad-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-whoareyouanas-tiktok-ad-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/whoareyouanas~tiktok-ad-scraper/runs": {
            "post": {
                "operationId": "runs-sync-whoareyouanas-tiktok-ad-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/whoareyouanas~tiktok-ad-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-whoareyouanas-tiktok-ad-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": {
                    "scrapeMode": {
                        "title": "Scrape Mode",
                        "enum": [
                            "ad_library",
                            "creative_center",
                            "both"
                        ],
                        "type": "string",
                        "description": "Choose which TikTok data source to scrape. Ad Library covers EU/EEA with rich targeting data. Creative Center covers 50+ countries globally with performance metrics. 'Both' runs both sources.",
                        "default": "ad_library"
                    },
                    "targetUrl": {
                        "title": "Direct URL (Optional)",
                        "type": "string",
                        "description": "Paste a TikTok Ad Library or Creative Center URL directly. If provided, all parameter fields below are ignored."
                    },
                    "searchQuery": {
                        "title": "Search Query",
                        "type": "string",
                        "description": "Keyword or advertiser name to search for (e.g. 'nike', 'shopify', 'gaming app')."
                    },
                    "advertiserId": {
                        "title": "Advertiser Business ID",
                        "type": "string",
                        "description": "TikTok advertiser business ID to look up all ads from a specific advertiser."
                    },
                    "country": {
                        "title": "Country / Region",
                        "enum": [
                            "all",
                            "US",
                            "GB",
                            "DE",
                            "FR",
                            "IT",
                            "ES",
                            "NL",
                            "PL",
                            "BE",
                            "SE",
                            "AT",
                            "DK",
                            "FI",
                            "IE",
                            "PT",
                            "CZ",
                            "RO",
                            "HU",
                            "SK",
                            "BG",
                            "HR",
                            "LT",
                            "SI",
                            "LV",
                            "EE",
                            "CY",
                            "LU",
                            "MT",
                            "GR",
                            "CH",
                            "NO",
                            "IS",
                            "LI",
                            "JP",
                            "KR",
                            "AU",
                            "BR",
                            "MX",
                            "IN",
                            "ID",
                            "TH",
                            "VN",
                            "PH",
                            "MY",
                            "SG",
                            "TW",
                            "CA",
                            "AR",
                            "CL",
                            "CO",
                            "PE",
                            "EG",
                            "SA",
                            "AE",
                            "TR",
                            "ZA",
                            "NG",
                            "KE"
                        ],
                        "type": "string",
                        "description": "Country code for filtering. For Ad Library: EU/EEA countries only (e.g. DE, FR, IT, ES, NL, GB). For Creative Center: any of 50+ countries (e.g. US, JP, BR, IN).",
                        "default": "all"
                    },
                    "industry": {
                        "title": "Industry (Creative Center only)",
                        "enum": [
                            "all",
                            "apparel_and_accessories",
                            "beauty_and_personal_care",
                            "ecommerce",
                            "education",
                            "finance",
                            "food_and_beverage",
                            "games",
                            "health",
                            "home_improvement",
                            "news_and_entertainment",
                            "tech_and_electronics",
                            "travel",
                            "vehicle"
                        ],
                        "type": "string",
                        "description": "Filter by industry vertical. Only applies to Creative Center mode.",
                        "default": "all"
                    },
                    "objective": {
                        "title": "Campaign Objective (Creative Center only)",
                        "enum": [
                            "all",
                            "app_install",
                            "traffic",
                            "lead_generation",
                            "conversions",
                            "reach",
                            "video_views",
                            "community_interaction"
                        ],
                        "type": "string",
                        "description": "Filter by campaign objective. Only applies to Creative Center mode.",
                        "default": "all"
                    },
                    "timePeriod": {
                        "title": "Time Period",
                        "enum": [
                            "7",
                            "30",
                            "180"
                        ],
                        "type": "string",
                        "description": "Time window for results. For Ad Library: custom date range via startDate/endDate. For Creative Center: preset windows.",
                        "default": "30"
                    },
                    "startDate": {
                        "title": "Start Date (Ad Library only)",
                        "type": "string",
                        "description": "Start date for Ad Library search in YYYY-MM-DD format. Defaults to 1 year ago."
                    },
                    "endDate": {
                        "title": "End Date (Ad Library only)",
                        "type": "string",
                        "description": "End date for Ad Library search in YYYY-MM-DD format. Defaults to today."
                    },
                    "sortBy": {
                        "title": "Sort By",
                        "enum": [
                            "last_shown_date_newest",
                            "last_shown_date_oldest",
                            "published_date_newest",
                            "published_date_oldest",
                            "unique_users_high",
                            "unique_users_low",
                            "reach",
                            "ctr",
                            "likes"
                        ],
                        "type": "string",
                        "description": "Sort order for results.",
                        "default": "last_shown_date_newest"
                    },
                    "quickSearch": {
                        "title": "Quick Search Mode",
                        "type": "boolean",
                        "description": "If enabled, skips detail page visits for faster, cheaper scraping. Returns search-level fields only (no targeting or detailed reach data). Recommended for large-volume scrapes.",
                        "default": false
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 0,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of ads to return. Set to 0 for unlimited. Ad Library has a platform cap of ~3,600 results per query.",
                        "default": 100
                    },
                    "maxConcurrency": {
                        "title": "Max Concurrency",
                        "minimum": 1,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Number of parallel requests. Keep at 1 for stability. Increase to 2-3 only if you need faster scraping.",
                        "default": 1
                    },
                    "requestHandlerTimeoutSecs": {
                        "title": "Page Timeout (seconds)",
                        "minimum": 60,
                        "maximum": 900,
                        "type": "integer",
                        "description": "Maximum time to wait for scraping to complete per page.",
                        "default": 300
                    },
                    "proxyUrl": {
                        "title": "Your Proxy URL (Recommended)",
                        "type": "string",
                        "description": "Residential proxy URL for reliable scraping. Format: http://groups-RESIDENTIAL:YOUR_APIFY_TOKEN@proxy.apify.com:8000. TikTok aggressively blocks datacenter IPs. External proxies (BrightData, Oxylabs) also supported."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
