# TikTok AI Detector — AI-Generated Videos & Quality Scraper (`yumitori/tiktok-ai-signals-scraper`) Actor

🤖 TikTok AI detector — detect AI-generated TikToks, including UNDISCLOSED AI TikTok flagged but the creator never labeled. Reads TikTok's native AI-content labels + video quality score, filters & effects. Scan any keyword, niche or the trending feed. No login, no proxy.

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

## Pricing

$3.00 / 1,000 videos

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

🤖 **See TikTok's own AI & quality signals on any video** — is it **AI-generated** (and did the creator *disclose* it, or did TikTok catch it *undisclosed*?), TikTok's internal **video-quality score**, the **filters/effects** used, auto-captions, detected language, and algorithmic category. By keyword, niche, or the live trending feed. No login, no proxy.

These are **TikTok's own native labels** — not a third-party AI guess. Every video TikTok itself has tagged as AI-generated, plus the ones its moderation **detected as AI even though the creator never labeled them.**

![native labels](https://img.shields.io/badge/TikTok's%20own-labels-2ea44f) ![undisclosed AI](https://img.shields.io/badge/detects-undisclosed%20AI-ff0050) ![quality score](https://img.shields.io/badge/TikTok-quality%20score-ff0050) ![no login](https://img.shields.io/badge/no%20login-no%20proxy-1f6feb)

> *Everyone sells "AI content detectors" that guess from pixels. This reads the label **TikTok already assigned** — including the AI it flagged that the creator tried to pass off as real.*

### 🎯 Why this is different

Search Apify for "TikTok AI" and you get **transcript extractors** (AI *transcribes* the video) and **LLM analysers** (AI *summarises* it). None of them expose TikTok's **own** algorithmic signals. This one does — straight from TikTok's API:

- **🕵️ Undisclosed-AI detection.** `moderationAigcLabelType` is TikTok's *own* system flagging a video as AI-generated. When that fires but the creator set no AI label, this actor marks it **`ai_detected_undisclosed`** — AI slipping through unlabeled. Nobody else surfaces this.
- **📊 Quality score.** TikTok's internal **video-quality score (0–100)** — the number its ranking system sees. Plus quality tier, resolution, bitrate, codec, and HD flag.
- **✨ Filters & effects.** Every effect/filter applied, with counts across a niche.
- **🌍 Auto-captions & language.** Whether TikTok auto-captioned it, the detected spoken language, and caption language.
- **🏷️ Algorithmic category.** TikTok's internal content category + diversification IDs.

### 📤 Output — per video

| Field | Description |
|---|---|
| `is_ai_generated` | TikTok flags it as AI (disclosed **or** detected) |
| `ai_disclosed` | the **creator** labeled it AI-generated |
| `ai_detected_undisclosed` | **TikTok detected AI the creator did NOT label** 🕵️ |
| `quality_score`, `quality_band` | TikTok's video-quality score (0–100) + high/medium/low |
| `quality_tier`, `resolution`, `is_hd`, `bitrate_kbps`, `codec` | full production-quality picture |
| `effects`, `effect_count` | filters/effects applied |
| `auto_caption`, `spoken_language`, `caption_language` | AI caption + language signals |
| `category_id`, `diversification_id` | TikTok's algorithmic categorization |
| `views`, `save_rate`, `engagement_rate`, `posted`, `age_days`, `creator*` | engagement, recency + creator context |

**Per-query aggregates** (with `onePerVideo` off): `ai_content_pct`, `ai_disclosed_pct`, **`ai_undisclosed_pct`**, `avg_quality_score`, `quality_high/medium/low`, `hd_pct`, `auto_caption_pct`, `top_effects`, `top_languages`, `top_ai_creators`.

### ▶️ Example runs

**Audit undisclosed AI in a niche:**
```json
{ "keywords": ["ai influencer", "faceless channel"], "maxVideos": 100, "onePerVideo": false }
````

**Build a dataset of only AI-generated videos:**

```json
{ "niches": ["ai art", "ai animation"], "aiOnly": true, "maxVideos": 150 }
```

**How much of what's going viral right now is AI?**

```json
{ "trendingVideos": true, "onePerVideo": false }
```

**Is AI spiking in a niche *this week*?** (date filter)

```json
{ "keywords": ["ai influencer"], "postedWithin": "7", "onePerVideo": false }
```

### 📦 Example output

**Default — one row per video** (`{ "keywords": ["ai generated story"] }`):

```json
{
  "video_url": "https://www.tiktok.com/@animeseries156/video/7635050592662064397",
  "creator": "animeseries156", "creator_name": "Anime series", "creator_followers": 203900,
  "is_ai_generated": true,
  "ai_disclosed": true,
  "ai_detected_undisclosed": false,
  "ai_label_type": 1,
  "quality_score": 70.5, "quality_band": "medium", "quality_tier": "normal",
  "resolution": "720p", "is_hd": false, "bitrate_kbps": 1961, "codec": "h264", "duration": 70,
  "effects": [], "effect_count": 0,
  "auto_caption": true, "spoken_language": "pol-PL", "caption_language": null,
  "category_id": 100, "diversification_id": 10052,
  "views": 13600000, "likes": 200200, "comments": 1285, "shares": 3726, "saves": 16900,
  "save_rate": 0.12, "engagement_rate": 1.63, "posted": "2026-05-01",
  "keyword": "ai generated story"
}
```

> An **undisclosed-AI** row looks identical but with `"ai_disclosed": false, "ai_detected_undisclosed": true` — e.g. `@sunnycartoon01`, which TikTok flagged as AI-generated even though the creator never labeled it.

**Aggregate — one row per query** (`{ "keywords": ["ai animation"], "onePerVideo": false }`):

```json
{
  "keyword": "ai animation",
  "video_count": 20,
  "ai_content_pct": 90,
  "ai_disclosed_pct": 55,
  "ai_undisclosed_pct": 35,
  "avg_quality_score": 69.8,
  "quality_high": 0, "quality_medium": 18, "quality_low": 1,
  "hd_pct": 0,
  "auto_caption_pct": 95,
  "top_languages": [{ "language": "eng-US", "count": 6 }, { "language": "kor-KR", "count": 2 }],
  "top_ai_creators": ["levkudrin", "craziest_a4", "chopstory_", "sunnycartoon01"],
  "top_effects": []
}
```

> **90% of "ai animation" videos are AI-generated — and 35% of them are *undisclosed*** (TikTok detected the AI; the creator never labeled it). Turn on **`aiOnly`** to keep just the flagged videos, or **`trendingVideos`** to run the same breakdown on the live For-You feed.

**Filters & effects (TikTok Effect House)** — effect-heavy niches name the exact filters used, and each trending filter links to its effect page (`{ "keywords": ["beauty filter"] }`):

```json
// per video — every filter/effect applied, by name
"effects": ["Bold Glamour", "Beautify", "Pink Skin bloom", "Idol Retro Blue"],
"effect_count": 4

// aggregate (onePerVideo: false) — trending filters, each linking to every video that uses it
"top_effects": [
  { "effect": "Bold Glamour",    "count": 10, "effect_url": "https://www.tiktok.com/effect/bold-glamour-14519845" },
  { "effect": "Idol Retro Blue", "count": 10, "effect_url": "https://www.tiktok.com/effect/idol-retro-blue-2125959484" },
  { "effect": "Pink Skin bloom", "count": 10, "effect_url": "https://www.tiktok.com/effect/pink-skin-bloom-282517011" }
]
```

> These filters are TikTok effects — many built by creators in **[TikTok Effect House](https://effecthouse.tiktok.com)**. `effects` names every filter on a video; `top_effects` ranks the filters a niche leans on and links each to its effect page (which lists **every video using it**). So you can spot the Effect House filter behind a look that's blowing up — or **check whether a creator's "natural" glow is really Bold Glamour**.

### 💡 What people use it for

- **Brand safety & ad verification** — filter out AI-slop before placing spend or partnering; flag undisclosed AI in a category.
- **AI-content researchers & journalists** — measure how fast AI-generated content is spreading by niche, and how much is going *unlabeled*.
- **Platform & policy teams** — benchmark undisclosed-AI rates and AI-label compliance across topics and markets.
- **Agencies & studios** — benchmark production quality (quality score, HD%, bitrate) against competitors and spot the filters trending in a niche.
- **Trust & safety / academic** — reproducible datasets of TikTok's own AI labels without manual review.
- **Filter / "catfish" check** — see whether a creator leans on beauty filters (Bold Glamour & co.) or AI enhancement rather than posting unfiltered — flags heavily-filtered or AI-generated profiles at a glance (handy before paying for or partnering with a creator).

### 🤖 Agentic AI use-cases

- **"Is this TikTok AI?" checker** — an agent takes a keyword/creator, runs this actor, and answers whether the content is AI-generated (disclosed vs. TikTok-detected-undisclosed) with the quality score attached.
- **AI-slop gatekeeper** — before an agent surfaces or reposts TikToks, drop anything `is_ai_generated` (or only `ai_detected_undisclosed`).
- **Undisclosed-AI monitor** — schedule on a niche; alert when `ai_undisclosed_pct` climbs (unlabeled AI rising) — an early-warning feed for trust & safety.
- **AI-proliferation tracker** — log `ai_content_pct` per niche daily to chart how fast AI-generated content is taking over a category.
- **Quality-bar filter** — keep only `quality_band == "high"` + `is_hd` clips for a highlight reel or competitor benchmark.
- **Filter-trend agent** — track `top_effects` week over week to catch the effect/filter a niche is adopting.
- **Brand-safety pre-check** — an agent vets a creator's recent videos for AI-generated content and quality before greenlighting a partnership.

### 🧩 Wire it into an AI agent (Claude, ChatGPT, n8n…)

This actor is a clean tool for agents — deterministic JSON in, structured signals out. Concrete scenarios:

- **Claude (via Apify MCP / tool use):** expose this actor as a tool and ask *"Vet @creator's niche for AI slop before we sponsor them."* Claude runs it, drops anything `ai_detected_undisclosed` or low `quality_band`, and returns a go/no-go with the exact flagged clips and reasons.
- **ChatGPT (Custom GPT Action / Assistants API):** build an *"Is this TikTok AI?"* GPT with the actor as an Action. A user types a niche or handle; the GPT calls it and replies with the AI %, the **undisclosed-AI %**, and which creators are posting unlabeled AI.
- **Autonomous / scheduled agents (n8n, LangChain, CrewAI):** schedule a trust-&-safety agent to run the actor nightly on a watchlist of niches; when `ai_undisclosed_pct` crosses your threshold it fires a Slack/email alert with the offending videos.
- **Analyst agent (any LLM):** pipe the `onePerVideo: false` aggregate rows into your model to auto-write a weekly *"State of AI content"* brief per niche — AI %, quality trend, top filters, top AI creators.
- **Content-pipeline guardrail (Gemini/Llama/any):** before an agent reposts or recommends TikToks, gate on `is_ai_generated` + `quality_band == "high"` so only human, high-quality clips pass.

### 💻 Run it from your code

**Python**

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("yumitori/tiktok-ai-signals-scraper").call(run_input={
    "keywords": ["ai animation"], "onePerVideo": False,
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row["keyword"], row["ai_content_pct"], row["ai_undisclosed_pct"], row["avg_quality_score"])
```

**CLI**

```bash
apify call yumitori/tiktok-ai-signals-scraper --input '{ "niches": ["ai art"], "aiOnly": true }'
```

### ⚡ Getting the most results

- **Up to 200 videos per query** — set `maxVideos` to 200.
- **Add many niches/keywords** — each is its own query and they run in parallel, so 20 keywords × 200 = up to 4,000 videos in one run. This is how you scale.
- **Turn on `trendingVideos`** for a big, no-keyword pull — it rotates TikTok's For-You feed across regions to aggregate a large, fresh set of viral videos.
- **Use `aiOnly`** to spend your budget only on AI-flagged videos (a denser AI dataset per credit).
- **Raise `concurrency`** (up to 10) to process more queries at once on bigger runs.

### 🔒 Proxies, cookies & safety

**Do I need a proxy?**
**No.** It signs TikTok's own public API directly, so it runs proxy-free on Apify's servers. No residential proxy, no proxy config, nothing extra to buy or set up.

**Does it use my TikTok login or cookies?**
**No login, no account, no cookies from you.** Each run mints its *own* fresh anonymous session token (the same `ttwid` any logged-out visitor gets). You never paste credentials, and none are stored.

**Is my TikTok account at risk? Could I get banned?**
There's no account involved to put at risk — it never logs in, follows, likes, or touches any account. Nothing is tied to your identity, so there's nothing to flag or ban.

**What data does it actually access?**
Only **publicly visible** fields TikTok returns for public videos — the same information anyone browsing TikTok logged-out can see. No private accounts, no DMs, no personal data beyond public creator handles.

**Will it get blocked / rate-limited?**
It calls TikTok's own signed endpoints the way a normal web client does, with pacing built in, so it behaves like ordinary traffic rather than aggressive scraping. Runs are resilient (automatic retries on transient hiccups).

**Where does my scraped data go?**
Into **your own private Apify dataset**. It isn't shared with anyone; you export or delete it whenever you want.

### ❓ FAQ

**Is this TikTok AI? How do I tell if a TikTok video is AI-generated?**
Run the video's keyword or creator through this actor — it returns TikTok's own AI label for each video. `is_ai_generated` is true when TikTok considers it AI-generated; `ai_disclosed` means the creator labeled it; `ai_detected_undisclosed` means TikTok's systems flagged it as AI even though the creator never labeled it. It's the fastest way to check if a TikTok is AI without eyeballing pixels.

**What's the best TikTok AI detector?**
Most "AI detectors" analyse pixels or text and *guess*. This TikTok AI detector reads the label **TikTok itself** already assigned to the video (`aigcLabelType` / `moderationAigcLabelType`), so it's accurate for TikTok content and — uniquely — flags **undisclosed AI** other detectors miss.

**How do I detect undisclosed AI content on TikTok?**
Turn on the analysis and filter for `ai_detected_undisclosed = true`, or read the per-query `ai_undisclosed_pct`. Those are the videos TikTok's moderation flagged as AI-generated where the creator set no AI label — unlabeled AI slipping through.

**How do I find AI-generated TikToks in a niche or hashtag?**
Enter the niche/keyword and turn on **AI-generated videos only** (`aiOnly`). You get a clean dataset of every AI-generated TikTok for that topic, with quality scores and the creators posting them.

**How do you detect AI-generated TikToks?**
We don't guess — we read TikTok's **own** labels. `aigcLabelType` is what the creator disclosed; `moderationAigcLabelType` is what TikTok's own systems detected. When the second fires without the first, the video is AI that wasn't disclosed.

**What is the quality score?**
TikTok's internal video-quality score (0–100) attached to the video object — the quality signal its ranking system uses. We expose it raw plus a high/medium/low band, alongside resolution, bitrate, codec, and HD.

**Can I get only AI videos?**
Yes — turn on **AI-generated videos only** (`aiOnly`) to return just the flagged ones.

**Does it work on the trending feed?**
Yes — enable **Trending videos** to analyse the live For-You feed with no keyword: a real-time read on how AI-heavy and how high-quality what's going viral is.

**Is this a third-party AI detector?**
No. Generic AI detectors analyse pixels/text and guess. This reports the label TikTok itself assigned, which is why it can flag *undisclosed* AI that a pixel-detector would miss or mislabel.

**Do I need a login, proxy, or seed URL?**
None. It signs TikTok's own public endpoints directly.

**Is it legal?**
It reads only publicly visible fields TikTok returns for public videos. You're responsible for complying with TikTok's Terms and applicable law.

***

> ⚠️ **Unofficial.** Not affiliated with, endorsed by, or sponsored by TikTok or ByteDance. Reads only publicly visible data. Respect TikTok's Terms of Service and applicable law.

# Actor input Schema

## `niches` (type: `array`):

Pick one or more popular niches to analyse — no typing needed. Every video comes back with TikTok's own AI-generated flag (incl. <b>undisclosed</b> AI), quality score, filters, language & category. You can combine niches with your own keywords below.

## `keywords` (type: `array`):

Any topic, hashtag, or search term — each becomes its own query. <b>Examples:</b> <code>ai influencer</code>, <code>faceless channel</code>, <code>product demo</code>, <code>ai voiceover</code>, <code>beauty filter</code>. One per line.

## `trendingVideos` (type: `boolean`):

Analyse the videos TikTok is pushing on the For-You feed <b>right now</b> — a live read on how much of what's going viral is AI-generated and how it scores on quality. Works with no keyword; can also be combined with niches/keywords above.

## `aiOnly` (type: `boolean`):

<b>ON:</b> return only the videos TikTok flags as AI-generated (disclosed or detected) — ideal for building a pure AI-content dataset, or auditing which creators post <b>undisclosed</b> AI. <b>OFF (default):</b> analyse everything so you also get the AI % of the niche.

## `postedWithin` (type: `string`):

Only keep videos posted within this window — great for measuring <b>how fresh</b> the AI content is, or catching a spike in AI/undisclosed-AI in the last week. Leave on <b>Any time</b> for no date filter. (Applied to the videos TikTok returns, so tighter windows may return fewer results.)

## `maxVideos` (type: `integer`):

How many videos to analyse per niche/keyword (max 200 — TikTok's search limit per term). <b>Tip:</b> to scale, add more niches/keywords rather than maxing this out — 20 keywords × 200 = ~4,000 videos in one run.

## `onePerVideo` (type: `boolean`):

<b>ON (default):</b> one dataset row per video, with every AI/quality signal — best for building a dataset. <b>OFF:</b> one summary row per query — AI %, <b>undisclosed-AI %</b>, avg quality score, quality breakdown, top filters, top languages, top AI creators — best for a quick at-a-glance read.

## `concurrency` (type: `integer`):

How many niches/keywords to process at the same time. Higher = faster on big runs; leave at 4 for normal use.

## Actor input object example

```json
{
  "niches": [],
  "keywords": [
    "ai generated animation"
  ],
  "trendingVideos": false,
  "aiOnly": false,
  "postedWithin": "0",
  "maxVideos": 40,
  "onePerVideo": true,
  "concurrency": 4
}
```

# 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 = {
    "keywords": [
        "ai generated animation"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("yumitori/tiktok-ai-signals-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 = { "keywords": ["ai generated animation"] }

# Run the Actor and wait for it to finish
run = client.actor("yumitori/tiktok-ai-signals-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 '{
  "keywords": [
    "ai generated animation"
  ]
}' |
apify call yumitori/tiktok-ai-signals-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "TikTok AI Detector — AI-Generated Videos & Quality Scraper",
        "description": "🤖 TikTok AI detector — detect AI-generated TikToks, including UNDISCLOSED AI TikTok flagged but the creator never labeled. Reads TikTok's native AI-content labels + video quality score, filters & effects. Scan any keyword, niche or the trending feed. No login, no proxy.",
        "version": "0.1",
        "x-build-id": "U52kDyWsOjj4WCLQ5"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/yumitori~tiktok-ai-signals-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-yumitori-tiktok-ai-signals-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/yumitori~tiktok-ai-signals-scraper/runs": {
            "post": {
                "operationId": "runs-sync-yumitori-tiktok-ai-signals-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/yumitori~tiktok-ai-signals-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-yumitori-tiktok-ai-signals-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": {
                    "niches": {
                        "title": "🎯 Niches to scan",
                        "type": "array",
                        "description": "Pick one or more popular niches to analyse — no typing needed. Every video comes back with TikTok's own AI-generated flag (incl. <b>undisclosed</b> AI), quality score, filters, language & category. You can combine niches with your own keywords below.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "skincare",
                                "makeup",
                                "fitness",
                                "recipes",
                                "fashion",
                                "gaming",
                                "anime",
                                "art",
                                "pets",
                                "cars",
                                "tech gadgets",
                                "home decor",
                                "travel",
                                "finance",
                                "motivation",
                                "comedy",
                                "asmr",
                                "storytime",
                                "ai art",
                                "ai animation"
                            ],
                            "enumTitles": [
                                "Skincare",
                                "Makeup",
                                "Fitness",
                                "Recipes",
                                "Fashion",
                                "Gaming",
                                "Anime",
                                "Art",
                                "Pets",
                                "Cars",
                                "Tech gadgets",
                                "Home decor",
                                "Travel",
                                "Finance",
                                "Motivation",
                                "Comedy",
                                "ASMR",
                                "Storytime",
                                "AI art",
                                "AI animation"
                            ]
                        },
                        "default": []
                    },
                    "keywords": {
                        "title": "🔎 …or type keywords / hashtags",
                        "type": "array",
                        "description": "Any topic, hashtag, or search term — each becomes its own query. <b>Examples:</b> <code>ai influencer</code>, <code>faceless channel</code>, <code>product demo</code>, <code>ai voiceover</code>, <code>beauty filter</code>. One per line.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "trendingVideos": {
                        "title": "🔥 …or scan the live Trending feed (no keyword)",
                        "type": "boolean",
                        "description": "Analyse the videos TikTok is pushing on the For-You feed <b>right now</b> — a live read on how much of what's going viral is AI-generated and how it scores on quality. Works with no keyword; can also be combined with niches/keywords above.",
                        "default": false
                    },
                    "aiOnly": {
                        "title": "🤖 AI-generated videos only",
                        "type": "boolean",
                        "description": "<b>ON:</b> return only the videos TikTok flags as AI-generated (disclosed or detected) — ideal for building a pure AI-content dataset, or auditing which creators post <b>undisclosed</b> AI. <b>OFF (default):</b> analyse everything so you also get the AI % of the niche.",
                        "default": false
                    },
                    "postedWithin": {
                        "title": "📅 Posted within",
                        "enum": [
                            "0",
                            "1",
                            "7",
                            "30",
                            "90",
                            "180"
                        ],
                        "type": "string",
                        "description": "Only keep videos posted within this window — great for measuring <b>how fresh</b> the AI content is, or catching a spike in AI/undisclosed-AI in the last week. Leave on <b>Any time</b> for no date filter. (Applied to the videos TikTok returns, so tighter windows may return fewer results.)",
                        "default": "0"
                    },
                    "maxVideos": {
                        "title": "Videos per query",
                        "minimum": 1,
                        "maximum": 200,
                        "type": "integer",
                        "description": "How many videos to analyse per niche/keyword (max 200 — TikTok's search limit per term). <b>Tip:</b> to scale, add more niches/keywords rather than maxing this out — 20 keywords × 200 = ~4,000 videos in one run.",
                        "default": 40
                    },
                    "onePerVideo": {
                        "title": "Output shape: one row per video",
                        "type": "boolean",
                        "description": "<b>ON (default):</b> one dataset row per video, with every AI/quality signal — best for building a dataset. <b>OFF:</b> one summary row per query — AI %, <b>undisclosed-AI %</b>, avg quality score, quality breakdown, top filters, top languages, top AI creators — best for a quick at-a-glance read.",
                        "default": true
                    },
                    "concurrency": {
                        "title": "Speed (parallel queries)",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "How many niches/keywords to process at the same time. Higher = faster on big runs; leave at 4 for normal use.",
                        "default": 4
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
