# TikTok Video Analyzer AI: Reels Breakdown, Hook & Scenes (`tactful_anvil/tiktok-video-analyzer-ai`) Actor

TikTok video analyzer & Instagram/Facebook Reels breakdown AI: transcript (script), hook analysis (type, strength, 3 new hooks), timed scene breakdown / shot list from real cuts, pacing, CTA and summary. Any username or video link. Pay per analysed video.

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

## Pricing

from $12.00 / 1,000 ai hook analyses

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## TikTok Video Analyzer AI — Reels Breakdown: Hook, Scenes, Script & Pacing

Paste **TikTok, Instagram Reels or Facebook Reels links** — or type a **creator's username** — and get a full **AI video breakdown** of every video: the **script** (timestamped transcript), the **hook** with its type, strength and why it works, the **structure beats**, the **CTA**, a **shot-by-shot scene list** with what is on screen, **pacing** (shots and cuts per minute), what is heard, and **3 new hooks** you can reuse. One row per video, ready for a creative brief, a swipe file, a spreadsheet or your own AI agent.

| Video | Hook (AI) | Hook type · strength | Pacing | What happens (AI) |
| --- | --- | --- | --- | --- |
| `@nasa` TikTok, 45 s | *Think about hundreds of square miles where we have different assets.* | curiosity_gap · 5/10 | 27 shots · 34.7 cuts/min | A small rover drives the lunar surface at night, engineers test hardware in a cleanroom and at mission consoles, an animated VIPER rover is "a scout for Moon Base"… |
| `@nasa` TikTok, 2:01 | *From breaking records on Mars to lighting up the skies over Earth, NASA put on quite a show this week.* | bold_claim · 6/10 | 31 shots · 14.9 cuts/min | A presenter opens a weekly roundup; animated footage traces Perseverance's record 28.1-mile route on Mars, then the CRS-35 launch… |
| `@nasa` TikTok, 16 s | *Alright everybody you got to take turns in, don't jump go here* | visual_only · 5/10 | 1 shot (one take) | Two men in blue flight suits film themselves walking through a packed football stadium… "Roll Tide!" |

*(Real output of this Actor, 30 Oct 2026.)*

```json
{ "urls": ["https://www.tiktok.com/@nasa/video/7698805564884733198"] }
```

**Price: $0.025 per fully analysed video** — transcript $0.008 + AI hook analysis $0.012 + AI scene breakdown $0.005. You pay only for what is delivered: a failed analysis, a private or deleted video, a duplicate or a music-only clip without anything to describe is **free**. No login, no cookies, no API keys to bring.

### What you get for every video

- **Script** — the full spoken transcript with timestamps (`segments`), language detection (99 languages), words per minute, optional SRT / WebVTT subtitles. Speech recognition is OpenAI Whisper running inside the Actor.
- **Hook analysis** — the opening line(s), `hookType` (question, bold claim, statistic, story, pain point, curiosity gap, how-to, list, controversy, demonstration, visual only), `hookStrength` 1-10 and `hookWhy` in plain words.
- **Structure beats** — 3-7 parts with timestamps (hook → setup → value → proof → CTA…), so you see how the video is built.
- **CTA, format, tone, audience** — `ctaType` + the CTA as said or shown, `contentFormat` (talking head, tutorial, listicle, storytime, skit, product demo, UGC ad, voiceover + B-roll, interview, news, vlog…), tone and target audience.
- **Summary, topics, key takeaways** — what the video says or sells, 3-6 topic tags, 2-5 concrete takeaways.
- **3 alternative hooks** — new opening lines for the same video, ready to test.
- **Scene breakdown / shot list** — `scenes[]` with `startSec`, `endSec`, what is shown, `shotType` (talking head, close-up, medium, wide, screen recording, text card, product shot, animation, archival) and the **words on screen** in that part.
- **What the video shows** — `description` (people, actions, objects, place, in order) and `videoSummary` for someone who cannot watch (visuals and speech together), plus setting, subjects, visual style and **visible brands**.
- **Pacing** — `shotCount`, `avgShotSeconds`, `cutsPerMinute` from the real cuts in the file.
- **Sound** — speech yes/no and its share of the video, the music track and artist, original audio or not. Measured, never guessed.
- **Video stats** — views, likes, comments, shares, saves, duration, upload date, caption, hashtags, mentions, music, creator, follower count, verified badge, `viewsVsCreatorMedian` and `isOutlier` (which videos beat the creator's usual views).

#### How the scenes are made (and why the timestamps are right)

Most "video analyzers" send a few evenly spaced frames to a model and ask it to guess where scenes start. This Actor first finds the **real shot cuts** in the video file (ffmpeg scene detection), takes a frame at every cut (plus one every few seconds inside long takes), and gives the AI up to 12 of them with their exact time spans. So `startSec` / `endSec` come from the video itself, and `cutsPerMinute` is measured, not estimated. Silent and music-only videos are described too — that is where a description helps most.

### For AI agents & LLMs — copy this block

```
Actor:   tactful_anvil/tiktok-video-analyzer-ai  (Apify Store)
Does:    TikTok / Instagram Reels / Facebook Reels link or creator username -> per video:
         transcript (script) + AI hook analysis (hook, type, 1-10 strength, why, beats, CTA, format,
         topics, summary, takeaways, 3 alternative hooks) + AI scene breakdown (timed scenes from real
         shot cuts, what is shown, summary for non-viewers, setting, subjects, style, brands, pacing, sound).
Run:     POST https://api.apify.com/v2/acts/tactful_anvil~tiktok-video-analyzer-ai/run-sync-get-dataset-items?token=APIFY_TOKEN
         (sync waits up to 5 minutes; for big batches use /runs and read the dataset afterwards)
Input    (every field optional; give urls and/or handles):
  {
    "urls": ["https://www.tiktok.com/@nasa/video/7698805564884733198",
             "https://www.instagram.com/reel/DeuH0dDFGcg/",
             "https://www.facebook.com/reel/1795689255099117"],
    "handles": ["tiktok:@nasa", "ig:zachking"],  // newest videos of these creators
    "profilePlatform": "tiktok",    // platform for plain usernames: tiktok | instagram | both
    "maxVideosPerProfile": 5,       // up to 500
    "analyze": true,                // AI hook analysis, $0.012/video (default on)
    "describeVideo": true,          // AI scene breakdown, $0.005/video (default on)
    "analysisLanguage": "",         // "en", "es", "pt", "id"…; empty = the video's own language
    "includeOnScreenText": false,   // +$0.002/video with text: onScreenText + timed onScreenTextSegments
    "translateTo": "",              // +$0.004/video: "es" / "pt-BR" / "Japanese" … with timestamps
    "onlyPostsNewerThan": "",       // "7 days", "2026-10-01" …
    "sortBy": "newest",             // newest | most_viewed
    "minViews": 0,
    "onlyNew": false, "watchlistId": "",  // monitoring: skip videos already analysed, rows get isNew/firstSeenAt
    "datasetId": "",                // analyse every video in another scraper's dataset
    "maxVideos": 100, "maxDurationSec": 180
  }
Output   one row per video. Key columns: url, author, status, charged, viewCount, durationSec,
         transcript, segments[], hook, aiHook, aiHookType, aiHookStrength, aiFormat, aiCtaType, aiSummary,
         aiAnalysis {hook, hookType, hookStrength, hookWhy, beats[{startSec,label,text}], ctaType, cta,
           contentFormat, topics[], keyTakeaways[], tone, targetAudience, alternativeHooks[]},
         description, videoSummary, scenes[{startSec,endSec,description,shotType,onScreenText,startsAtCut,shots}],
         sound {hasAudio, speech, speechSeconds, speechShare, music, track, artist, originalAudio},
         videoDescription {setting, subjects, visualStyle, visibleBrands[], shotCount, avgShotSeconds,
           cutsPerMinute, framesRead, model}, aiCharged, descriptionCharged.
         status "ok" = transcribed. Any other status is FREE and `error` says why.
Pricing  $0.008 transcript + $0.012 AI analysis + $0.005 AI scene breakdown = $0.025 per video,
         + start fee $0.001 per GB of run memory. Each part charged only when delivered.
Not for  YouTube (status youtube, free), private / followers-only videos.
```

**MCP in one line:** add `https://mcp.apify.com/?tools=tactful_anvil/tiktok-video-analyzer-ai` as an MCP server in Claude, Cursor, VS Code or any MCP client. Then ask: *"Break down the 5 newest TikToks of @nasa — hooks, scenes and pacing."*

### Who is this for?

- **Creators and short-form editors** — see why a video holds attention: the hook, the beats, how fast it cuts, what is on screen when.
- **UGC and performance marketers** — build a swipe file of competitor ads and viral videos with hooks, CTAs, formats and shot lists, then brief your creators from it.
- **Agencies** — turn a client's or competitor's last 30 videos into a creative audit in one run.
- **Researchers and AI builders** — structured, timestamped video understanding (script + visuals) for datasets, RAG and agents, without running your own vision pipeline.

### Example output (one row, shortened)

```json
{
  "url": "https://www.tiktok.com/@nasa/video/7698805564884733198",
  "platform": "tiktok",
  "author": "nasa",
  "status": "ok",
  "charged": true,
  "durationSec": 45,
  "viewCount": 266600,
  "likeCount": 10500,
  "hook": "Think about hundreds of square miles where we have different assets.",
  "transcript": "Think about hundreds of square miles where we have different assets. Definitely mobility systems…",
  "aiHook": "Think about hundreds of square miles where we have different assets.",
  "aiHookType": "curiosity_gap",
  "aiHookStrength": 5,
  "aiFormat": "voiceover_broll",
  "aiAnalysis": {
    "status": "ok",
    "hookWhy": "It sets up a large-scale challenge, but the opening is abstract and doesn't name the Moon or the vehicles until later, so it only weakly earns the next seconds.",
    "beats": [
      { "startSec": 0, "label": "hook", "text": "Hundreds of square miles, different assets, mobility systems needed." },
      { "startSec": 15, "label": "role", "text": "VIPER acts as a scout for Moon Base." },
      { "startSec": 18, "label": "proof", "text": "Three mockups built, two of them within three weeks." },
      { "startSec": 26, "label": "goal", "text": "Going to stay and learn how to live on the Moon." }
    ],
    "ctaType": "follow",
    "topics": ["moon base", "lunar rover", "viper", "lunar south pole", "space exploration", "nasa"],
    "keyTakeaways": ["VIPER is intended to act as a scout for Moon Base.", "NASA's stated goal is for humans to operate on the Moon permanently."],
    "tone": "informative, optimistic",
    "alternativeHooks": [
      "Going back to the Moon means figuring out how to get around.",
      "NASA's VIPER rover is being built to scout the Moon's South Pole first.",
      "Our goal is humans living on the Moon permanently, not just visiting."
    ]
  },
  "videoSummary": "The video explains how a Moon Base will need vehicles to get around the lunar South Pole. It shows a small rover on the Moon at night, engineers testing hardware in a cleanroom and at mission consoles, and an animated VIPER rover described as a scout for Moon Base…",
  "scenes": [
    { "startSec": 0, "endSec": 3.5, "description": "Close view of the full Moon with the title MOON BASE over a dark background.", "shotType": "animation", "onScreenText": "MOON BASE", "startsAtCut": false, "shots": 1 },
    { "startSec": 3.5, "endSec": 7.8, "description": "A small white wheeled rover with an American flag and Astrolab label drives across dusty lunar ground under a spotlight.", "shotType": "product_shot", "onScreenText": "where we have different assets.", "startsAtCut": true, "shots": 3 },
    { "startSec": 7.8, "endSec": 10.8, "description": "A technician in a white cleanroom suit, hairnet and headset leans over a desk with monitors and cables.", "shotType": "medium_shot", "onScreenText": "There's a lot of people who spent a lot of time", "startsAtCut": true, "shots": 4 }
  ],
  "sound": { "hasAudio": true, "speech": true, "speechSeconds": 43.2, "speechShare": 0.96, "music": true, "track": "Strings", "originalAudio": false },
  "videoDescription": {
    "status": "ok",
    "setting": "Lunar surface renders, cleanroom, mission control, and an American flag backdrop",
    "visualStyle": "Mixed NASA footage and CGI animation with white captions, fast cuts and slow pans",
    "visibleBrands": ["NASA", "Astrolab", "VIPER"],
    "shotCount": 27,
    "avgShotSeconds": 1.7,
    "cutsPerMinute": 34.7,
    "framesRead": 12,
    "model": "claude-haiku-5-5"
  },
  "aiCharged": true,
  "descriptionCharged": true
}
```

The **Breakdown** tab of the dataset shows creator, hook, hook type and strength, format, what happens, CTA, views and length as a table; the **Transcripts** tab shows the scripts. Export to CSV, Excel, JSON or Google Sheets.

### Pricing — pay per video, only for what is delivered

| Part | Event | Price | Charged when |
| --- | --- | --- | --- |
| Transcript (script, stats, timestamps) | `transcript` | $0.008 | the video was transcribed (status `ok`) |
| AI hook analysis | `ai-analysis` | $0.012 | the analysis is in the row (`aiCharged: true`) |
| AI scene breakdown | `video-description` | $0.005 | the description is in the row (`descriptionCharged: true`) |
| On-screen text (optional) | `on-screen-text` | $0.002 | `includeOnScreenText` is on and text was found |
| AI translation (optional) | `translation` | $0.004 | `translateTo` is set and the translation is delivered |
| Long videos (optional) | `extra-minute` | $0.003 / minute | each started minute past 10 minutes (`maxDurationSec` up to 1800) |
| Run start | `apify-actor-start` | $0.001 per GB | every run ($0.002 with the default 2 GB) |

**Examples:** 10 videos fully analysed = **$0.25**. 100 videos = **$2.50**. Transcript + hook analysis only (`describeVideo: false`) = $0.020 per video. Transcript only (both AI options off) = $0.008 per video.

- A music-only or silent video has no transcript and no hook analysis, but it still gets a scene breakdown ($0.005) — the only part that applies.
- If the AI step fails for a video (rare), that part is free and the row says why in `aiAnalysis.error` / `videoDescription.error`.
- **Apify free plan:** the first 10 videos per run get the AI analysis and the scene breakdown (transcripts are not capped). Paid plans: no cap.
- "Maximum cost per run" is respected: videos that would go over it come back as `budget_limit` rows, not processed and not charged.

### How to use it (no code)

1. Paste video links into **Video URLs** — or creators into **Profiles** (pick the platform for plain usernames).
2. Leave **AI analysis** and **AI scene breakdown** on (default). Optional: set the breakdown language, read on-screen text, translate.
3. Click **Start**. A video usually takes well under a minute; 10 videos finish in a few minutes.
4. Open the **Breakdown** tab, or export.

### Recipes

**Competitor swipe file — the 20 most viewed TikToks of three brands in the last 90 days**

```json
{ "handles": ["tiktok:@gymshark", "tiktok:@duolingo", "tiktok:@ryanair"], "maxVideosPerProfile": 20, "sortBy": "most_viewed", "onlyPostsNewerThan": "90 days" }
```

**Daily monitor — only the videos posted since the last run, breakdown in Spanish**

```json
{ "handles": ["ig:zachking", "tiktok:@zachking"], "maxVideosPerProfile": 10, "onlyNew": true, "watchlistId": "zach-daily", "analysisLanguage": "es" }
```

Schedule it daily in Apify (Schedules) — every row says `isNew` and `firstSeenAt`, and videos already analysed are skipped and never charged twice.

**Analyse the output of another scraper** — any TikTok / Instagram / Facebook scraper's dataset:

```json
{ "datasetId": "YOUR_DATASET_ID", "maxVideos": 200 }
```

**Hooks only, cheaper** — `{ "urls": [...], "describeVideo": false }` ($0.020/video). **Scenes and visuals only for silent edits** — keep both on; music-only clips get the scene breakdown alone.

### Use it via API

```bash
curl -X POST "https://api.apify.com/v2/acts/tactful_anvil~tiktok-video-analyzer-ai/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"urls": ["https://www.tiktok.com/@nasa/video/7698805564884733198"]}'
```

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('tactful_anvil/tiktok-video-analyzer-ai').call({ handles: ['tiktok:@nasa'], maxVideosPerProfile: 5 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const v of items) console.log(v.aiHookStrength, v.aiHook, v.videoDescription?.cutsPerMinute);
```

```python
from apify_client import ApifyClient
client = ApifyClient("APIFY_TOKEN")
run = client.actor("tactful_anvil/tiktok-video-analyzer-ai").call(run_input={"urls": ["https://www.tiktok.com/@nasa/video/7698805564884733198"]})
for v in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(v["aiHookType"], v["aiHookStrength"], [s["description"] for s in v.get("scenes") or []])
```

A machine-readable run receipt is saved in the run's key-value store as `SUMMARY` (rows per status, how many analyses and descriptions were charged, tokens used) — it reconciles with the `charged`, `aiCharged` and `descriptionCharged` columns.

### Input reference

| Field | Default | What it does |
| --- | --- | --- |
| `urls` | — | TikTok videos, Instagram Reels, Facebook Reels / videos; short links work. |
| `handles` | — | Creators: `@name`, `name`, profile links, `tiktok:@name`, `ig:name`. |
| `profilePlatform` | `tiktok` | Platform for plain usernames: `tiktok`, `instagram`, `both`. |
| `maxVideosPerProfile` | 5 | Newest (or most viewed) videos per creator, up to 500. |
| `analyze` | `true` | AI hook analysis ($0.012/video). |
| `describeVideo` | `true` | AI scene breakdown ($0.005/video). |
| `analysisLanguage` | own language | Language of the analysis and breakdown (`en`, `es`, `pt`, `id`…). |
| `includeOnScreenText` | `false` | Also read all on-screen text into `onScreenText` ($0.002/video with text). |
| `translateTo` | — | Translate the transcript with timestamps ($0.004/video). |
| `onlyPostsNewerThan`, `skipPinned`, `minViews`, `sortBy` | — | Filters for profiles and links; filtered videos are never downloaded or charged. |
| `datasetId`, `datasetItems` | — | Analyse videos from another scraper's output. |
| `onlyNew`, `watchlistId` | — | Monitoring memory; `isNew` / `firstSeenAt` on every row. |
| `language`, `model`, `includeSrt`, `includeVtt`, `wordTimestamps`, `chunkWords`, `translateToEnglish`, `maxComments` | — | Transcript options (same as the transcript engine). |
| `maxVideos` | 100 | Hard cap of unique videos per run. |
| `maxDurationSec` | 180 | Seconds of each video to process (up to 1800; past 10 minutes $0.003/minute). |

Input names of other video Actors (`startUrls`, `usernames`, `maxItems`, `resultsLimit`, `skipPinnedPosts`, `onlyReelsNewerThan`, `newReelsOnly`…) are understood too.

### Status values

| Status | Charged | Meaning |
| --- | --- | --- |
| `ok` | transcript yes (+ AI parts when delivered) | Transcribed and analysed. |
| `no_speech` | no transcript; scene breakdown if delivered | Music, sound effects or silence only. |
| `no_audio` | no transcript; scene breakdown if delivered | The video has no sound track. |
| `photo_post` | no | A TikTok photo post (slideshow) — no video. |
| `caption_only` | no | Instagram did not serve this single Reel's file without a login; the public caption is returned. Use the creator's username in Profiles instead. |
| `blocked`, `network_error`, `geo_restricted`, `download_failed`, `transcribe_failed` | no | The video could not be fetched or decoded; `error` says why. |
| `private`, `login_required`, `not_found` | no | Never accessed by design / deleted / mistyped. |
| `budget_limit`, `timeout` | no | Not processed: your maximum cost per run or the run timeout was reached. |
| `invalid`, `unsupported`, `youtube` | no | Not a supported link. |

Every run ends **SUCCEEDED** with a status message like *"3 transcribed (charged) · 3 described (charged) · 3 AI analyses (charged)"*. A bad link never fails the run.

### Why this Actor

- **Scene timestamps from real shot cuts** in the video file, and pacing (`cutsPerMinute`) measured over every cut — not estimated.
- **Silent and music-only videos are described too** (scene breakdown only, $0.005) instead of being skipped.
- **The full script**, not just a summary: Whisper transcript with timestamps in 99 languages, SRT / VTT on request.
- **By username**: the newest or most viewed videos of any public TikTok or Instagram creator, up to 500 per profile, with date / views filters and daily monitoring.
- **$0.025 per full breakdown**, billed per part and only for what is delivered — other breakdown Actors on the Store charge $0.03-$0.075 per video (Oct 2026).

### Limits and honest notes

- **Public videos only.** No login, no cookies, no bypassing of private accounts or age gates.
- **Instagram single Reel links** sometimes need a login for the file; then the row is `caption_only` and free. Usernames (profile listing) work much better for Instagram.
- **TikTok profiles** are occasionally hidden from servers for a moment ("not found" for a real account) — the Actor retries 3 times and says so honestly.
- **Up to 12 frames per video** go to the AI (spread over the whole video, one per shot where possible), so a 3-minute video with 50 cuts gets 12 scenes that each cover several shots (`shots` says how many).
- **No face recognition.** The AI does not name people from their faces; a name appears only when the caption, on-screen text or speech gives it.
- The AI is Claude (Anthropic) — analysis, scene breakdown and translation. Video content is treated as material to analyse, never as instructions.
- **YouTube** is not handled here.

### FAQ

**Is this a TikTok video analyzer or a transcript tool?** Both: every row has the full script (transcript) plus the AI breakdown on top. Turn the AI options off to get transcripts only ($0.008/video).

**Does it work for Instagram Reels and Facebook Reels?** Yes — same breakdown for Reels and Facebook Reels / videos. For Instagram, prefer usernames over single links (see Limits).

**Can I get the breakdown in another language?** Yes, `analysisLanguage` (e.g. `es`, `pt`, `de`, `id`, `ja`). Quoted hooks and on-screen words stay as they are. `translateTo` translates the transcript itself with timestamps.

**How accurate is the hook strength?** It is a consistent 1-10 judgment by the same model with the same rubric for every video (specific, surprising, tension → high; slow, generic → low), with a one-sentence reason — useful for comparing videos side by side, not a prediction of views. Compare with `viewsVsCreatorMedian` to see what actually performed.

**What is a "shot list" here?** `scenes[]`: each entry covers a time span starting at a real cut, with what is shown, the shot type and the words on screen. `videoDescription.shotCount` and `cutsPerMinute` count every cut in the video, not only the 12 frames sent to the AI.

**Can I monitor creators daily?** Yes — `onlyNew: true` + a `watchlistId`, scheduled in Apify. Only new videos are processed and charged.

**Can my AI agent use it?** Yes — copy the block above, or connect it through the Apify MCP server.

### Changelog

- **0.1 (30 Oct 2026)** — first release: transcript + AI hook analysis + AI scene breakdown from real shot cuts, pacing and sound, on by default; on-screen text, translation and long videos optional.

# Actor input Schema

## `urls` (type: `array`):

TikTok videos, Instagram Reels and Facebook Reels / videos to break down — one link per line. Short links (vm.tiktok.com, fb.watch) work; profile links pasted here are listed like Profiles. Duplicates are skipped automatically.

## `handles` (type: `array`):

Break down the newest videos of TikTok or Instagram creators — <code>@zachking</code>, <code>https://www.tiktok.com/@zachking</code> or <code>https://www.instagram.com/zachking/</code>. Plain usernames use <b>Platform for usernames</b> below; <code>tiktok:@name</code> / <code>ig:name</code> pick the platform per line.

## `profilePlatform` (type: `string`):

Where to look up plain usernames (<code>@name</code> / <code>name</code>). Profile links always use their own platform.

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

Newest videos to break down from each profile (after the filters below). Up to 500 per profile.

## `analyze` (type: `boolean`):

Claude AI reads each transcribed video: the hook with its type and strength (1-10) and why it works, structure beats with timestamps, call to action, format, topics, summary, key takeaways, tone, audience and 3 alternative hooks you can reuse. <b>$0.012 per analysed video</b> (event <code>ai-analysis</code>), charged only when the analysis is delivered. Apify free plan: the first 10 videos per run.

## `describeVideo` (type: `boolean`):

Claude AI looks at frames taken at every real shot cut: timed scenes (shot list with shot type and on-screen words), a description of what the video shows, a summary for someone who cannot watch, setting, subjects, visual style, visible brands, plus pacing (shot count, cuts per minute) and what is heard (speech share, music track). Silent and music-only videos are described too. <b>$0.005 per described video</b> (event <code>video-description</code>), charged only when the description is delivered. Apify free plan: the first 10 videos per run.

## `analysisLanguage` (type: `string`):

Write the analysis and scene breakdown in this language — a code like <code>en</code>, <code>es</code>, <code>pt</code>, <code>id</code>. Empty = each video's own language. Quoted hooks, CTAs and on-screen words stay as they are.

## `includeOnScreenText` (type: `boolean`):

Also read the words shown on the video (burned-in captions, titles, text-only videos with music) into <code>onScreenText</code> + timed <code>onScreenTextSegments</code>. <b>+$0.002 per video where text was found</b> (event <code>on-screen-text</code>); also works on music-only videos that have no transcript.

## `translateTo` (type: `string`):

Translate every transcript into this language with the timestamps kept (translated segments, plus SRT / VTT when those are on): a code like <code>es</code>, <code>de</code>, <code>pt-BR</code>, <code>ja</code> or a name like <code>Spanish</code>. <b>+$0.004 per translated video</b> (event <code>translation</code>); videos already in that language are skipped for free. For English only, <i>Translate to English</i> below is free.

## `onlyPostsNewerThan` (type: `string`):

A date (<code>2026-10-01</code>) or a period (<code>7 days</code>, <code>24 hours</code>, <code>2 weeks</code>, <code>3 months</code>). Older videos are skipped before download and never charged. Empty = no date filter.

## `skipPinned` (type: `boolean`):

Leave out the videos a creator pinned to the top of the profile (they are often old).

## `minViews` (type: `integer`):

Only transcribe videos with at least this many views (0 = all). Videos whose views are not public are kept.

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

<b>Newest</b> = the most recent videos. <b>Most viewed</b> = the top videos by views among the latest ones listed (about 3× <i>Videos per profile</i>, at least 36).

## `datasetId` (type: `string`):

Transcribe the videos found by another Actor run — paste its dataset ID (e.g. from an Instagram, TikTok or Facebook scraper). The post link is read from <code>url</code>, <code>webVideoUrl</code>, <code>postUrl</code>, <code>shortCode</code> and similar fields; Instagram rows with a <code>videoUrl</code> file are transcribed straight from that file. Photo posts are skipped.

## `datasetItems` (type: `array`):

Same as Dataset ID, but with the rows pasted directly (any shape, e.g. <code>\[{"url": "https://www.tiktok.com/@nasa/video/…"}]</code>).

## `onlyNew` (type: `boolean`):

Skip videos that an earlier run of yours already transcribed (remembered in a key-value store named <code>short-video-transcript-seen</code> in your account). Ideal for a daily schedule that watches the same creators.

## `watchlistId` (type: `string`):

Give a monitoring job its own memory, e.g. <code>competitors</code> or <code>client-acme</code>. Every row then gets <code>isNew</code> and <code>firstSeenAt</code>; with <b>Only new videos</b> on, videos already on this list are skipped. Empty = the shared memory of <b>Only new videos</b>.

## `language` (type: `string`):

Two-letter code such as <code>en</code>, <code>es</code>, <code>id</code>, <code>pt</code>. Leave empty to detect the language of every video automatically (99 languages).

## `model` (type: `string`):

<b>base</b> = good accuracy, recommended. <b>tiny</b> = fastest, fine for clear English speech. Same price.

## `preferNativeCaptions` (type: `boolean`):

Some TikToks carry captions published by the creator / TikTok. When on, those are returned instead of running speech recognition (faster). Off = always transcribe the audio.

## `includeSegments` (type: `boolean`):

Add a <code>segments</code> array (start, end, text) for subtitles, clipping and hooks.

## `includeSrt` (type: `boolean`):

Add a ready-to-use <code>srt</code> subtitle string to every row.

## `includeVtt` (type: `boolean`):

Add a ready-to-use <code>vtt</code> (WebVTT) subtitle string to every row — the web/HTML5 subtitle format.

## `wordTimestamps` (type: `boolean`):

Add <code>words</code> \[{start, end, word}] inside every segment — for karaoke captions, precise clipping and word search. Uses speech recognition even when the platform has captions.

## `chunkWords` (type: `integer`):

Also cut each transcript into <code>chunks</code> of about this many words, each with start / end seconds — ready for embeddings and retrieval. 0 = off.

## `translateToEnglish` (type: `boolean`):

Add <code>translationEn</code>: the spoken words translated to English by Whisper itself (non-English videos only; English videos get their transcript). Same price.

## `maxComments` (type: `integer`):

Add the most-liked comments of every transcribed TikTok (pinned first) as <code>topComments</code>. 0 = off. Instagram and Facebook do not show comments without a login.

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

Stop after this many unique videos in total (links + all profiles).

## `maxDurationSec` (type: `integer`):

Audio after this point is not transcribed and the row is marked <code>truncated</code>. Up to 30 minutes: the first 10 minutes of every video are included, each started minute past 10 minutes costs $0.003 (event <code>extra-minute</code>).

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

Not needed for most runs. If a platform starts blocking downloads (status <code>blocked</code>), a residential proxy can help.

## Actor input object example

```json
{
  "urls": [
    "https://www.tiktok.com/@nasa/video/7700397098994273549",
    "https://www.tiktok.com/@nasa/video/7698805564884733198"
  ],
  "profilePlatform": "tiktok",
  "maxVideosPerProfile": 5,
  "analyze": true,
  "describeVideo": true,
  "includeOnScreenText": false,
  "onlyPostsNewerThan": "",
  "skipPinned": false,
  "minViews": 0,
  "sortBy": "newest",
  "onlyNew": false,
  "language": "",
  "model": "base",
  "preferNativeCaptions": true,
  "includeSegments": true,
  "includeSrt": false,
  "includeVtt": false,
  "wordTimestamps": false,
  "chunkWords": 0,
  "translateToEnglish": false,
  "maxComments": 0,
  "maxVideos": 100,
  "maxDurationSec": 180,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `breakdowns` (type: `string`):

Every row of the run, in input order of completion.

# 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 = {
    "urls": [
        "https://www.tiktok.com/@nasa/video/7700397098994273549",
        "https://www.tiktok.com/@nasa/video/7698805564884733198"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tactful_anvil/tiktok-video-analyzer-ai").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 = { "urls": [
        "https://www.tiktok.com/@nasa/video/7700397098994273549",
        "https://www.tiktok.com/@nasa/video/7698805564884733198",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("tactful_anvil/tiktok-video-analyzer-ai").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "https://www.tiktok.com/@nasa/video/7700397098994273549",
    "https://www.tiktok.com/@nasa/video/7698805564884733198"
  ]
}' |
apify call tactful_anvil/tiktok-video-analyzer-ai --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tactful_anvil/tiktok-video-analyzer-ai"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/K4SHHqMSt7u2PKufR/builds/jghCQow8VnnZZnqyP/openapi.json
