Video Ad Creative Breakdown - TikTok, Reels, YouTube & Files avatar

Video Ad Creative Breakdown - TikTok, Reels, YouTube & Files

Pricing

from $20.00 / 1,000 videos

Go to Apify Store
Video Ad Creative Breakdown - TikTok, Reels, YouTube & Files

Video Ad Creative Breakdown - TikTok, Reels, YouTube & Files

Break down public TikTok, Instagram Reels and YouTube videos/Shorts or your own ad files: hook (speech + on-screen text of the first 3 s), shot list with keyframes, transcript, pacing and hook/body/CTA. No LLM inside. $0.025 per video.

Pricing

from $20.00 / 1,000 videos

Rating

0.0

(0)

Developer

Kanto Labs

Kanto Labs

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 hours ago

Last modified

Categories

Features

Limited permissions

Share

What does Video Ad Creative Breakdown do?

Video Ad Creative Breakdown turns public TikTok, Instagram Reels and YouTube videos and Shorts, or your own ad and short-form video files, into a structured creative breakdown: the hook (what is said and what is written on screen in the first 3 seconds, plus the first frame), a shot list with a keyframe, on-screen text and speech for every shot, the full transcript, pacing numbers (cuts per minute, average shot length, words per minute, how much of the video has text on screen) and a simple hook / body / CTA structure. Each video also gets a contact sheet image, a JSON file and a ready-to-paste Markdown creative brief.

Paste public video links (a TikTok video, an Instagram reel or post, a YouTube video or Short) or direct links to video files (your creatives on Google Drive, Dropbox, S3/R2/GCS, a CDN). One row per video, $0.025 per video up to 3 minutes - the same price for links and files.

Who is it for?

  • Brands and in-house creative teams auditing their own ad library: which hooks, pacing and CTAs the winning ads share.
  • Performance and UGC agencies that receive dozens of creator videos a week and need the same teardown for every one.
  • Media buyers tagging creatives before a test: hook type, cut speed, text density, CTA.
  • Ad and UGC researchers studying public TikToks, Reels and Shorts: paste the links, get the same teardown for every video.
  • Teams with ad files saved from ad libraries or their own ad manager (link the files directly).
  • AI workflows: the brief and JSON are made to be pasted into ChatGPT, Claude or Gemini, or sent through n8n / Make / Zapier.

What you get for every video

PartWhat is inside
Hookspeech of the first 3 s, on-screen text of the first 3 s, first-frame image, shots in the hook, time of the first cut, first full sentence
Shot liststart / end / length, transition (cut, dissolve, fade), keyframe image, on-screen text and speech per shot
TranscriptWhisper speech recognition with word timing, split into timed sentences, language detected
On-screen textevery caption, title, offer and end card with start / end time and position; logos and watermarks flagged as persistent
Pacingshot count, cuts per minute, average / median / shortest / longest shot, time to first cut, words per minute, speech share, text-on-screen share
Structurehook / body / CTA sections with their time ranges, shots, speech and text
CTAthe closing on-screen text and closing line, plus signals found in them: links, phone numbers, @handles, prices / % off, and CTA phrases (shop now, visit, sign up, download, use code...)
LabelshookType (question, offer, how-to, story / POV, social proof...), ctaType (shop, sign-up, contact, learn more, follow) and a pacing label, each with the words that triggered it - fixed rules, see below
Filescontact sheet (one keyframe per shot, labelled), full JSON, Markdown creative brief

How the breakdown is made (no LLM inside)

Nothing in the output is written by a language model, so the same video always gives the same breakdown:

  • Shots come from our own cut detector (the one behind Video Scene Detection): hard cuts, dissolves and fades, with flash and camera-motion rejection.
  • Speech is OpenAI Whisper (base model) running inside the Actor, with word timestamps.
  • On-screen text is PP-OCR (the engine behind Video OCR), read twice a second in the hook, about once a second after that (wider on long videos), and at least once in every shot.
  • Hook / body / CTA is a fixed rule: the hook is the first 3 seconds (you can change it); the CTA is the closing section: the last on-screen text (end card) and the last spoken sentence, when they start in the closing part of the video (last 35 %, at most the last 30 s). The CTA section starts at the end card, or at the last line when that line leads straight into the card (or when there is no card). Everything in between is the body. cta.hasSignals tells you whether a link, phone number, @handle, price or call-to-action phrase was actually found there.

That makes the output a clean, factual input for your own AI: paste the Markdown brief (and the contact sheet) into ChatGPT or Claude and ask for a hook rating, hook variations, a script rewrite or a comparison across ads.

Hook type and CTA labels

Every analysed video also gets plain label columns, so the usual "paste it into ChatGPT and ask what kind of hook it is" step is done for you. They are fixed word rules, not AI scoring: the same video always gets the same label, and every label lists the words that triggered it, so you can see why.

ColumnWhat it is
hookTypethe main hook label (first matching rule in the table below)
hookTypesevery hook rule that matched
hookWordsthe evidence, e.g. question: did you, offer: 50% off
ctaType / ctaTypes / ctaWordsthe call-to-action type of the closing section, all matches, and the evidence
cutsPer10Seconds / pacingLabelcut speed: static (< 0.5 cuts per 10 s), slow (< 1.5), medium (< 3), fast (< 5), very-fast (5+)
labelLanguageen when English words were read; other when the words are in another language (labels are then unknown)
rowTypevideo on every video row, summary on the summary row

What the hook rules read: the opening line (speech of the first 3 s - or your hook length - completed to the end of the sentence in progress, at most 3 s more) and the on-screen text read in the hook. The CTA rules read the closing section: the CTA section, or the last 25 % of the video (at most the last 15 s), whichever starts earlier.

Hook type (priority order)Rule (examples of the words matched)
offera price ($19, €5), "% off", sale, discount, promo code, use code, free shipping, free trial, giveaway, deal, limited time
before-afterbefore and after, transformation, glow up, then vs now, day 1 vs, after 30 days, went from
social-proofreviews, rated, 5 stars, customers, testimonial, sold out, best seller, trusted by, "10,000 people", dermatologist recommended, product review
how-tohow to, here's how, step 1, tutorial, tip(s), hack, trick, ways to, guide, let me show you, recipe, try this
questiona question mark, or a line that opens with what / why / who / where / do you / are you / is this / have you / ever wonder
story-povPOV, when you, me when, I tried, I was, I just, I used to, story time, my name is, my mom / my daughter..., first time, I found
warningmistake, avoid, warning, beware, tired of, struggling, scam, "stop using", "don't buy", "never put"... (a command that opens the line)
numbera statistic or counted list: 90%, 3x, "9 out of 10", "5 ways", "3 mistakes", "30 days", "10,000 people" (ages, years and prices do not count)
bold-claimbest, #1, the only, biggest, fastest, secret, nobody, guaranteed, game changer, unbelievable, world's, must-have, ever
you-addressyou, your, you're, yourself, y'all
statementEnglish words, but no rule above matched
visual-onlyno speech and no on-screen text in the hook
unknownthe hook's words are not English
CTA type (priority order)Rule (examples)
shopshop now, buy now, order now, get yours, add to cart, available at, in stores, use code, "% off", "$300 off", save $, give it a try
sign-upsign up, download, install, get the app, App Store, Google Play, register, join now, free trial, create an account, apply now
contactcall now, book now, contact us, DM us, a phone number (1-800-...)
learn-morelearn more, find out more, visit, go to, link in bio, link below, check it out, read more, a website address
followfollow (us / for more), subscribe, comment, share this, tag a friend, save this, let me know, turn on notifications, an @handle
nonea closing section without any of the above (or no closing words at all)
unknownthe closing words are not English

Languages: the rules match English words only. If the speech is in another language, or the on-screen text is in another script or uses another language's common words, the label is unknown instead of a guess. A video with no speech and no text in the hook is visual-only in any language.

How well do the labels match a person's judgement? We labelled 98 real public videos by hand (TV ads and PSAs from Wikimedia Commons plus recent TikToks of 15 brands, NASA and a few creators) and compared. The rules were tuned on these videos, so treat the numbers as a guide, not a guarantee. The main hook label matched our label on 96 of 98 videos, and the CTA type on 97 of 98.

LabelTimes givenAgreed with our label
statement2496 %
you-address2391 %
visual-only19100 %
question14100 %
story-pov1493 %
how-to7100 %
bold-claim6100 %
social-proof, number, offer2-3 eachall agreed - too few to be sure
warning, before-after0not seen in the set - not measured
CTA none / learn-more / unknown73 / 9 / 999 % / 89 % / 100 %
CTA shop / contact / follow / sign-up4 / 3 / 2 / 1all agreed - too few to be sure

Known limits: song lyrics are transcribed like speech, so a music-only video can get a you-address label from the lyrics; a single stylised word on screen ("SKIMS") may give unknown. Labels are a fast first sort for hundreds of videos - read hookWords before you rely on one.

Competitor hook report

When a run analyses 2 or more videos (for example a competitor's ads from a scraper dataset), the Actor adds one free summary row (rowType: "summary", status: "summary") after the video rows, and saves the same numbers as a Markdown file competitor-hook-report.md (link in reportUrl):

  • hook-type mix (hookTypeCounts, hookTypeShares), median time to the first cut, median cuts per 10 s, pacing mix,
  • share of videos with on-screen text in the hook (hookTextShare), CTA-type mix and the top 3 CTA types,
  • the most common hook words, and per author / page (byAuthor) when the rows come from a scraper (or from TikTok / Instagram / YouTube links),
  • hook type vs median views (byHookType) when the scraper gives view counts.

The summary row is never charged (no event, no price change). Switch it off with Add a competitor hook report = off if your integration expects video rows only, or filter on rowType.

How to break down an ad video

  1. Put one or more links in Video links, one per line: public TikTok videos (including vm.tiktok.com share links), Instagram reels or single-video posts, YouTube videos or Shorts, or direct video file links (MP4, MOV, WEBM, MKV, M4V...). Google Drive and Dropbox share links work when shared as "anyone with the link".
  2. Optional: set the spoken language (auto-detect by default), the on-screen text script (English by default; Latin, Cyrillic, Korean, Arabic, Devanagari, Greek, Thai available) and the hook length.
  3. Click Start. Each video becomes one row; open Creative brief (.md) or the contact sheet from the Videos view, or use the Shot list and Transcript views.
  • Public videos only. The Actor visits the link like a logged-out viewer (no account, no cookies) through Apify Proxy. Private, removed, age-restricted, members-only or region-locked videos cannot be read - they become free rows with the reason.
  • One video per link. Channels, profiles, playlists, hashtags, photo slideshows and live streams are refused (free).
  • Platforms sometimes ask logged-out visitors to sign in ("confirm you're not a bot"). The Actor retries on other proxy IPs; if the platform still refuses, the row is free and says so - run that link again later. This happens most on YouTube.
  • Video is fetched at up to 1080p (H.264 preferred), so platform videos are billed at the base price.
  • Rows from links also carry platform, sourceUrl, videoId, title, author, authorHandle, caption, uploadDate, viewCount, likeCount and commentCount (whatever the platform shows publicly; empty when it does not).
  • Only analyse videos you are allowed to use: your own, your clients', or for research and commentary. Facebook, X, Vimeo, Twitch and other sites stay unsupported.

Input example

{
"videoUrls": [
"https://www.tiktok.com/@brand/video/7300000000000000000",
"https://www.instagram.com/reel/AbCdEfGhIjK/",
"https://www.youtube.com/shorts/AbCdEfGhIjK",
"https://your-bucket.s3.amazonaws.com/ads/summer-sale-v3.mp4",
"https://drive.google.com/file/d/1AbC.../view?usp=sharing"
],
"language": "auto",
"ocrLanguage": "en",
"hookSeconds": 3
}

Output example

One row per video. Real output of the built-in sample (a 30-second public-domain CDC TV ad), shortened - the full row also has every shot, sentence and text segment, plus structure with the speech and text of each section:

{
"fileName": "sample-creative-ad.mp4",
"status": "ok",
"durationSeconds": 30.21,
"aspectRatio": "16:9",
"orientation": "horizontal",
"hook": {
"seconds": 3,
"speech": "",
"onScreenText": ["A TIP FROM A
FORMER
SMOKER"],
"onScreenTextJoined": "A TIP FROM A FORMER SMOKER",
"frameUrl": "https://api.apify.com/v2/key-value-stores/<store>/records/...-hook-first-frame.jpg?signature=...",
"shotCount": 1,
"firstCutSeconds": null,
"firstSentence": "My name is Brett and I used to smoke."
},
"pacing": {
"shotCount": 4, "cutCount": 3, "cutsPerMinute": 6, "averageShotSeconds": 7.54, "medianShotSeconds": 3.45,
"shortestShotSeconds": 3.04, "longestShotSeconds": 20.22, "timeToFirstCutSeconds": 3.04,
"wordCount": 47, "wordsPerMinute": 93, "speechShare": 0.398, "textOnScreenShare": 0.47
},
"cta": {
"found": true,
"startSeconds": 26.46,
"onScreenText": "YOU CAN QUIT.
FOR FREE HELP, VISIT
CDC.GOV/TIPS
CDC
Brought to you by the U.S. Department of Health and Human Services
#CDCTips",
"speech": "For free help visit cdc.gov slash tips",
"signals": ["link: CDC.GOV/TIPS", "link: cdc.gov", "phrase: visit"],
"hasSignals": true
},
"shots": [
{
"index": 2, "start": 3.036, "end": 23.257, "durationSeconds": 20.22, "transition": "cut",
"keyframeUrl": "https://api.apify.com/v2/key-value-stores/<store>/records/...-shot002-00013000ms.jpg?signature=...",
"onScreenText": ["Brett, 49
New Mexico"],
"speech": "My name is Brett and I used to smoke. I quit. But not until I got a serious gum disease. ..."
}
],
"transcript": {
"status": "ok", "language": "en", "model": "Whisper base", "wordCount": 47,
"sentences": [{"start": 3.18, "end": 5.06, "text": "My name is Brett and I used to smoke."}]
},
"onScreenText": [
{"start": 3, "end": 7.5, "text": "Brett, 49
New Mexico", "position": "bottom", "confidence": 0.9731, "isPersistent": false}
],
"contactSheetUrl": "https://api.apify.com/v2/key-value-stores/<store>/records/...-contact-sheet.jpg?signature=...",
"briefUrl": "https://api.apify.com/v2/key-value-stores/<store>/records/...-creative-brief.md?signature=...",
"jsonUrl": "https://api.apify.com/v2/key-value-stores/<store>/records/...-breakdown.json?signature=...",
"billingMultiplier": 1,
"billedVideos": 1,
"billedExtraMinutes": 0,
"rowType": "video",
"hookType": "how-to",
"hookTypes": ["how-to"],
"hookWords": ["how-to: tip"],
"ctaType": "learn-more",
"ctaTypes": ["learn-more"],
"ctaWords": ["learn-more: visit", "learn-more: cdc.gov", "learn-more: cdc.gov/tips"],
"cutsPer10Seconds": 0.99,
"pacingLabel": "slow",
"labelLanguage": "en"
}

The Console has these views: Videos (contact sheet, hook, hook type, pacing, CTA type, brief link), Shot list (one line per shot with its keyframe), Transcript, Scraper dataset (flat) and Competitor hook report (summary row).

How much does it cost?

Pay per event, no subscription and no start fee beyond Apify's tiny default:

EventPriceWhen
Video$0.025each video broken down; covers the first 3 minutes
Extra minute$0.01each started minute beyond 3 minutes

Worked examples: 100 ads of 15-60 seconds = $2.50. A 4:30 video = $0.025 + 2 x $0.01 = $0.045. Silver and Gold Apify plans get 10 % and 20 % off.

Videos up to 1080p (including vertical 1080x1920 and 1080x1350) are billed as above. Larger frames cost more to decode, so each started 2.2 megapixels counts once: 1440p = 2 videos, 4K = 4 videos (the row shows billingMultiplier and a note). Export or upload ads at 1080p to pay the base price.

Free: private, removed or blocked TikTok / Instagram / YouTube videos, unsupported sites, failed downloads (404, private file, web page, image or audio file instead of a video), unreadable files and files without a picture. Every free row says why, in plain words. Set Max cost per run and the Actor stops cleanly before a video that would go over it (that video and the rest get free "skipped" rows). The run timeout is respected the same way: a video that cannot finish before your run timeout is not started (or is stopped), gets a free "skipped" row that names the timeout to set, and the run still ends as Succeeded. Skipped rows carry skipReason: max-cost or timeout. Short API / n8n / AI-agent timeouts: allow about 70-100 s for one 30-second video and about 50 s more for each further one.

Good to know

  • Videos without speech (music-only ads, silent text ads) are still broken down - shots, on-screen text, pacing - and the transcript says "no-speech" or "no-audio".
  • CTA phrases are matched in English; links, phone numbers, @handles and prices are found in any language.
  • Whisper base can misspell brand and product names; OCR can misread very stylised fonts, and moving or word-by-word captions may appear as several pieces.
  • Animated titles that jump between positions can count as cuts; very slow dissolves may be missed.
  • Videos up to 15 minutes by default (up to 120 with "Max video length").

Use it after a TikTok / Instagram / FB Ads scraper

Already scraping competitors' posts or ads? Skip the download-transcribe-paste glue: pick the scraper run's dataset in Scraper dataset and every video in it is broken down, in the dataset's order. To chain automatically, add an Apify integration on the scraper ("run an Actor when the run succeeds") and pass {"datasetId": "{{resource.defaultDatasetId}}"}.

Scraper whose dataset you pickVideo read fromCopied next to the breakdown
clockworks/tiktok-scraper, kantolabs/tiktok-scraperthe TikTok link (or the video file, if the scraper saved it to Apify storage)author, caption, views, likes, comments, shares, post date
apify/instagram-scraper, instagram-reel-scraper, instagram-post-scraperthe reel's video file (videoUrl), then the public reel link if that file link has expiredauthor, caption, plays, likes, comments, post date
apify/facebook-ads-scraperthe ad's video file (snapshot.videos / cards, HD then SD)page name, ad ID, ad text, start date, active flag, CTA button, landing page
Meta Ad Library scrapers jmlp/meta-ad-library-scraper, automation-lab/facebook-ads-librarythe ad's video file (snapshot.videos HD then SD / videoUrls)page name, ad library ID, ad copy, start date, active flag, CTA button, landing page
streamers/youtube-scraperthe video or Short linkchannel, title, views, likes, comments, date
any other datasetthe first link in videoUrl, webVideoUrl, url...id, caption / text / title
  • Flat columns: dataset runs add plain columns (upstreamAuthor, upstreamViews, upstreamLikes, upstreamPostedAt, upstreamAdId, hookSpeech, hookOnScreenText, cutsPerMinute, wordsPerMinute, ctaSignals, transcriptText, onScreenTextAll...) next to the nested fields, so a Google Sheets / CSV export or a CRM step needs no flattening. The Scraper dataset (flat) view shows them. For video-link runs, switch on Add flat columns.
  • One row per dataset row, same order (inputIndex). Photo posts, carousels without a video and image or image-carousel ads get a free row with skipReason: no-video and the reason.
  • Max videos from the dataset (default 20 = $0.50 at most) keeps a first try cheap.
  • Only new videos (watch mode): schedule the scraper and this Actor (an Apify integration "run after the scraper succeeds" or two schedules). Videos already broken down are remembered in a key-value store in your account (kanto-breakdown-watch-<watchlist name>) and left out of later runs, so you pay only for new posts. TikTok / Instagram / YouTube videos are recognised by their video ID and ads by their ad ID, so the same video found again by another scraper is not charged twice.
  • Same price as links and files: $0.025 per video; rows without a video, failed downloads and anything already in the watchlist are free.

FAQ

Can it analyse a TikTok, Reels or YouTube link? Yes - public single videos, logged out, at the same price as a file. If the platform will not serve the video to a logged-out visitor, the row is free and says why.

Does it use ChatGPT or another AI to write the breakdown? No. Speech recognition (Whisper) and text recognition (PP-OCR) run inside the Actor; everything else is measured or rule-based - including the hook type and CTA labels, which are published word rules, not AI scoring. That keeps it cheap and repeatable, and you keep full control of the AI step.

How accurate is the hook / body / CTA split? It is a rule, not an opinion: hook = first N seconds, CTA = closing text + closing line. It is right for typical direct-response ads; for stories without an end card the CTA may be missing (the row says so).

Is my video stored? Only the outputs (images, JSON, brief) are saved in your own Apify storage. The downloaded video is deleted when the run ends.

Is this an official TikTok, Instagram or YouTube tool? No. It is an independent Actor by Kanto Labs and is not affiliated with or endorsed by TikTok, Instagram/Meta or YouTube/Google.

Something looks wrong? Open an issue in the Issues tab with the video link and what you expected - we answer quickly.

⌂ 捒网址