YouTube Script AI Analyzer - Hooks, Pacing & CTA Teardown
Pricing
from $150.00 / 1,000 video analyzeds
YouTube Script AI Analyzer - Hooks, Pacing & CTA Teardown
Analyze YouTube video scripts in bulk for competitor research. Input video URLs or a channel URL (auto-pulls top-viewed videos). Returns structured JSON per video: hooks, timestamped scene blocks, CTAs, pacing, tone, SEO keywords, and attention-rated winner/weak moments. Charged per analyzed video.
What does YouTube Script AI Analyzer do?
The YouTube script analyzer for competitor research. Paste a channel — or specific video URLs — and get a structured script teardown for every video: hook, pacing, CTAs, tone, title alignment, and attention-rated winning moments, all in one sortable JSON row per video.
Point it at a channel URL and it automatically finds and analyzes that channel's top-viewed videos — no hunting for individual links. Or paste up to 50 specific URLs to compare a curated set head-to-head.
Under the hood it fetches public captions and metadata from YouTube, segments each script into timestamped blocks, classifies every block with a fixed schema, and converts a public attention signal into coarse winner / neutral / weak labels. For batches of 3+ videos it also emits a cross-video pattern summary at no extra charge.
Run it from Apify Console, schedule it, or call it via API. Download results as JSON, CSV, or Excel.
Why use YouTube Script AI Analyzer?
- Tear down a whole channel in one run. Paste a channel URL; the Actor ranks its top-viewed recent videos and analyzes each one. Perfect for sizing up a competitor fast.
- Compare competitor scripts without reading every transcript. Each run returns timestamped blocks, hook type, CTA placements, SEO keywords, and pacing stats for every video.
- Evidence-backed labels. Attention-rated
winnerandweakmoments come from a public signal, not guesswork. - Stable JSON output. Fixed schema across every run — easy to sort, filter, and pipe into your own tools or automations.
- Batch pattern detection. Analyze 3–50 videos and get a cross-video summary: repeated winning tactics, weak moves, common scene sequences, and pacing medians.
- Pay only for results. Failed, private, or caption-less videos are not charged.
Who is this for?
| Persona | Job to be done |
|---|---|
| Content agencies | Compare competitor scripts for a client niche without reading every transcript |
| Faceless-channel operators | Find repeatable script moves from proven videos backed by structured evidence |
| Creator-tool builders | Feed stable script intelligence (JSON) into a workflow or product |
Raw transcript buyers are out of scope — there are 100+ cheaper transcript Actors for that.
How to use YouTube Script AI Analyzer
- Open the Actor on Apify Console.
- Either paste public YouTube video URLs into the Video URLs field, or paste a Channel URL (e.g.
https://www.youtube.com/@HalfasInteresting) and set Top N to analyze that channel's top-viewed recent uploads. You can do both — up to 50 videos total. - Leave Include Batch Pattern Summary checked if you want cross-video patterns (free, requires 3+ usable videos).
- Click Start and wait for the run to complete (typically 30–90 seconds per video; channel runs also spend a little time ranking).
- Open the Dataset tab to browse, sort, or download results.
Input
Analyze specific videos:
{"video_urls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ","https://www.youtube.com/watch?v=9bZkp7q19f0","https://www.youtube.com/watch?v=JGwWNGJdvx8"],"include_batch_summary": true,"language": "en"}
Or analyze a channel's top-viewed recent videos:
{"channel_url": "https://www.youtube.com/@HalfasInteresting","top_n": 20,"include_batch_summary": true,"language": "en"}
| Field | Type | Default | Notes |
|---|---|---|---|
video_urls | string[] | optional | Public YouTube URLs. Provide these, channel_url, or both — up to 50 videos total |
channel_url | string | optional | A channel URL. Expands to its top-top_n most-viewed recent uploads (not all-time) |
top_n | integer | 20 | 1–50. How many top-viewed recent videos to pull from channel_url. Each is charged |
include_batch_summary | boolean | true | Emits a batch summary row when 3+ videos succeed. Included, not charged. |
language | string | "en" | V1: English captions only |
Provide at least one of video_urls or channel_url. A channel run analyzing 20 videos costs about $3.00 (20 × $0.15); the ranking step is not charged.
Output
You can download the dataset in JSON, CSV, HTML, or Excel from the Dataset tab.
video_teardown row (attention rating applied)
{"record_type": "video_teardown","video_id": "9bZkp7q19f0","video_url": "https://www.youtube.com/watch?v=9bZkp7q19f0","title": "PSY - GANGNAM STYLE(강남스타일) M/V","duration_sec": 253,"attention_rating_status": "applied","analysis_notes": "Strong hook with visual contrast. CTA cluster at 70% mark.","hook_type": "visual_contrast","hook_strength": 0.82,"cta_placements": [176.0, 231.0],"title_alignment": "Title matches hook framing and first 10 seconds.","seo_keywords": ["gangnam style", "kpop", "viral music video"],"block_count": 14,"pattern_interrupts_total": 9,"interrupts_per_minute": 2.13,"blocks": [{"id": 0,"t0": 0.0,"t1": 12.4,"text": "Oppa Gangnam style...","scene_type": "hook","pulls": ["pattern_interrupt", "high_energy_open"],"tone_markers": ["playful", "high_energy"],"pattern_interrupts": 1,"attention_rating": "winner"}]}
video_teardown row (attention rating unavailable)
{"record_type": "video_teardown","video_id": "dQw4w9WgXcQ","video_url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ","title": "Rick Astley - Never Gonna Give You Up","duration_sec": 212,"attention_rating_status": "unavailable","analysis_notes": "Attention rating unavailable — this video's public engagement signal isn't established yet (this can happen with newer or lower-traffic videos). The full script teardown above is complete; only the per-block winner/weak attention labels are affected.","hook_type": "music_intro","hook_strength": null,"cta_placements": [],"title_alignment": "Title matches song content.","seo_keywords": ["rick astley", "never gonna give you up", "80s pop"],"block_count": 11,"pattern_interrupts_total": 4,"interrupts_per_minute": 1.13,"blocks": [{"id": 0,"t0": 0.0,"t1": 18.0,"text": "We're no strangers to love...","scene_type": "hook","pulls": ["familiar_reference"],"tone_markers": ["sincere", "nostalgic"],"pattern_interrupts": 0,"attention_rating": "unavailable"}]}
batch_pattern_summary row
{"record_type": "batch_pattern_summary","source_video_ids": ["9bZkp7q19f0", "dQw4w9WgXcQ", "JGwWNGJdvx8"],"repeated_winning_pulls": ["pattern_interrupt", "open_loop"],"repeated_weak_moves": ["delayed_hook", "generic_cta"],"common_scene_sequences": ["hook -> frame -> story", "exposition -> list_item -> cta"],"pacing_summary": {"median_block_count": 12.0,"median_interrupts_per_minute": 1.8},"attention_rating_coverage": {"applied": 2,"unavailable": 1}}
Field Reference
video_teardown fields
| Field | Type | Description |
|---|---|---|
record_type | string | Always "video_teardown" |
video_id | string | YouTube video ID |
video_url | string | Original input URL |
title | string | Video title |
duration_sec | integer | Video duration in seconds |
attention_rating_status | string | "applied" or "unavailable" |
analysis_notes | string | Brief plain-English summary of key observations |
hook_type | string | Identified hook strategy (e.g. "open_loop", "visual_contrast") |
hook_strength | float or null | Rating-backed hook score 0–1; null when rating is unavailable |
cta_placements | float[] | Timestamps (seconds) where CTAs appear |
title_alignment | string | How well the title aligns with the hook and first block |
seo_keywords | string[] | Keywords identified in the script |
block_count | integer | Total number of script blocks |
pattern_interrupts_total | integer | Total rhetorical/structural shifts across all blocks |
interrupts_per_minute | float | Pattern interrupts per minute (comparable across videos) |
blocks | object[] | Timestamped script blocks (see below) |
blocks[] item fields
| Field | Type | Description |
|---|---|---|
id | integer | Block index (0-based) |
t0 | float | Start time in seconds |
t1 | float | End time in seconds |
text | string | Block transcript text |
scene_type | string | hook, frame, story, exposition, evidence, list_item, turn, payoff, cta, or outro |
pulls | string[] | Attention tactics used (e.g. "open_loop", "social_proof") |
tone_markers | string[] | Short tone labels (e.g. "urgent", "conversational") |
pattern_interrupts | integer | Structural or rhetorical shifts within this block |
attention_rating | string | "winner", "neutral", "weak", or "unavailable" |
batch_pattern_summary fields
| Field | Type | Description |
|---|---|---|
record_type | string | Always "batch_pattern_summary" |
source_video_ids | string[] | IDs of videos included in this summary |
repeated_winning_pulls | string[] | Tactics seen in winner-rated blocks across multiple videos |
repeated_weak_moves | string[] | Patterns seen in weak-rated blocks across multiple videos |
common_scene_sequences | string[] | Repeated block-order patterns |
pacing_summary.median_block_count | float | Median block count across analyzed videos |
pacing_summary.median_interrupts_per_minute | float | Median interrupts per minute |
attention_rating_coverage.applied | integer | Videos where the attention rating was successfully applied |
attention_rating_coverage.unavailable | integer | Videos where the attention rating was unavailable |
Pricing
$0.15 per successfully analyzed video (launch test price). The video_analyzed event is charged once per video_teardown row emitted.
| Item | Cost |
|---|---|
| Actor start | $0.00005 (platform fee) |
| Each analyzed video | $0.15 |
| Batch pattern summary | Included — $0 extra |
| Failed, private, or caption-less videos | $0 — not charged |
Example: Analyze 10 competitor videos → $0.00005 + (10 × $0.15) = $1.50005
Pricing is subject to change after the cloud cost spike confirms real per-video LLM and compute costs. Subscribe to Actor updates for changes.
How to run via API
Python (apify-client)
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_API_TOKEN")run_input = {"video_urls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ","https://www.youtube.com/watch?v=9bZkp7q19f0",],"include_batch_summary": True,"language": "en",}run = client.actor("dominvo/youtube-script-ai-analyzer").call(run_input=run_input)for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
Tips
- Start with 3–5 videos to verify the output structure before running a full batch.
- Use
include_batch_summary: true(the default) any time you submit 3+ URLs — the cross-video summary is the most actionable output for competitor research. - Filter by
record_typein your downstream tool to separate teardown rows from the summary row. - Sort by
interrupts_per_minuteto quickly find the fastest-paced videos in a batch. - Videos without English captions are skipped and not charged.
FAQ
Is this affiliated with YouTube or Google? No. This Actor reads publicly available captions and metadata — the same data accessible in any browser. It is not affiliated with, endorsed by, or a product of YouTube or Google.
English captions only? Yes, V1 supports English captions only. Other languages may be added after demand is confirmed.
What is the "attention rating"?
The Actor converts a publicly available per-segment signal into coarse block-level labels: winner, neutral, or weak. This is not YouTube's private creator audience-retention curve and does not represent any internal YouTube analytics data. When the signal is unavailable for a video, all blocks get attention_rating: "unavailable" and attention_rating_status: "unavailable".
What counts as a "failed" video? Private videos, deleted videos, age-gated videos, and videos without English captions are all skipped and not charged. You'll see a log message for each skip.
Can I export to CSV or Excel?
Yes. Use the Dataset tab's export options or the API with ?format=csv or ?format=xlsx.
Need help or a custom solution? Open an issue on the Issues tab or contact the actor author.