Instagram Reel Hooks & Competitor Analyzer
Pricing
from $1.80 / 1,000 reel results
Instagram Reel Hooks & Competitor Analyzer
Analyze Instagram Reels from competitor accounts. Extract hooks, captions, hashtags, audio, posting cadence, and engagement metrics in flat CSV-friendly output for benchmarking, content research, and creative strategy.
Pricing
from $1.80 / 1,000 reel results
Rating
0.0
(0)
Developer
Delowar Munna
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 days ago
Last modified
Categories
Share

Analyze Instagram Reels from competitor accounts. Extract hooks, captions, hashtags, audio, posting cadence, and engagement metrics in flat CSV-friendly output for benchmarking, content research, and creative strategy.
What this actor does
Instagram Reel Hooks & Competitor Analyzer turns public Reels from any public Instagram profile (or direct Reel URLs) into a structured competitive-intelligence dataset. It is not a generic Reel downloader. The focus is on analysis-ready output:
- opening hook extraction + rule-based hook-style classification
- CTA type detection (
link_in_bio,dm,save,follow,share,buy, …) - hashtag / mention / audio extraction
- posting cadence (weekday, hour, days since published)
- engagement ratios and account-level benchmarks (views vs the profile's sample average, performance bucket)
Output is one flat row per Reel — ideal for CSV, Google Sheets, BI tools, or as clean input for downstream LLM summarization.
How it works
- Input — provide public profile URLs, bare usernames, or direct Reel URLs.
- Profile fetch — for each profile, call Instagram's public
web_profile_infoendpoint and the Reels tab endpoint to collect up tomaxReelsPerProfilerecent Reels. - Direct Reel fetch — for each Reel URL, resolve the shortcode and fetch
/api/v1/media/{id}/info/. - Normalize — extract a stable set of fields from whatever shape Instagram returned.
- Derive — compute hook text, hook style, CTA type, hashtags/mentions, cadence, ratios, and sample benchmarks.
- Export — push one flat row per Reel to the dataset.
Inputs
| Field | Type | Default | Description |
|---|---|---|---|
startUrls | string[] | required | Profile URLs, bare usernames, or Reel URLs (mix freely) |
maxReelsPerProfile | int | 20 | Cap Reels per profile input |
dateFrom | ISO date | — | Only include Reels published on/after this date |
dateTo | ISO date | — | Only include Reels published on/before this date |
skipPinnedReels | bool | true | Skip pinned Reels (they distort benchmarks) |
includeProfileContext | bool | true | Emit profile* fields on every row |
includeDerivedFields | bool | true | Emit hookStyle, ctaType, ratios, benchmarks |
includeHashtagsArray | bool | true | Emit hashtags as array |
includeMentionsArray | bool | true | Emit mentions as array |
includeAudioFields | bool | true | Emit audioTitle, audioArtist, audioType, audioOriginal |
includeVideoUrl | bool | false | Emit best-effort signed video URL |
requestTimeoutSecs | int | 300 | Per-request timeout |
maxConcurrency | int | 1 | Concurrent inputs |
debugMode | bool | false | Verbose logging |
Sample inputs
Example 1 — Multi-account competitor analysis
Compare Reel output across three competitor accounts, newest 30 each, skipping pinned Reels so benchmarks aren't distorted.
{"startUrls": ["https://www.instagram.com/nike/","https://www.instagram.com/adidas/","lululemon"],"maxReelsPerProfile": 30,"skipPinnedReels": true,"includeProfileContext": true,"includeDerivedFields": true}
Example 2 — Single Reel deep dive
Analyze one specific Reel with full profile context, audio metadata, and the optional signed video URL.
{"startUrls": ["https://www.instagram.com/reel/DWicOUHDvp5/"],"includeProfileContext": true,"includeAudioFields": true,"includeVideoUrl": true}
Example 3 — Date-windowed profile scan
Pull only Reels published in Q1 2026 from a single brand profile, trim output to scalar fields only (no arrays) for pure CSV workflows.
{"startUrls": ["https://www.instagram.com/teslaaunz/"],"maxReelsPerProfile": 50,"dateFrom": "2026-01-01","dateTo": "2026-03-31","skipPinnedReels": true,"includeHashtagsArray": false,"includeMentionsArray": false,"includeAudioFields": true}
Output
The run produces a single dataset view — Reel Rows — with one flat, CSV-friendly row per Reel.

Sample record (one row per Reel)
Real output from analyzing https://www.instagram.com/teslaaunz/:
{"inputUrl": "https://www.instagram.com/teslaaunz/?hl=en","sourceType": "profile","profileUsername": "teslaaunz","profileFullName": "Tesla Australia and New Zealand","profileUrl": "https://www.instagram.com/teslaaunz/","profileId": "59601257554","profileIsVerified": false,"profileCategoryName": null,"profileBiography": "We design and build products that people love.","profileExternalUrl": "https://www.tesla.com/en_au","profileFollowersCount": 11350,"profileFollowingCount": 6,"profilePostsCount": 151,"reelId": "3864775559205550713","reelShortcode": "DWicOUHDvp5","reelUrl": "https://www.instagram.com/reel/DWicOUHDvp5/","reelType": "reel","isPinned": false,"publishedAt": "2026-03-31T06:06:55.000Z","publishedDate": "2026-03-31","publishedTimestamp": 1774937215,"caption": "Reliable back up power and up to AUD $1,500/ NZD $1,700 back on your install. T&Cs apply","hookText": "Reliable back up power and up to AUD $1,500/ NZD $1,700 back on your install. T&Cs apply","hookLine1": "Reliable back up power and up to AUD $1,500/ NZD $1,700 back on your install. T&Cs apply","hookLengthChars": 88,"hookLengthWords": 17,"hookStyle": "other","ctaType": "none_detected","hashtags": [],"mentions": [],"taggedUsers": [],"hashtagCount": 0,"mentionCount": 0,"languageHint": "en","audioTitle": null,"audioArtist": null,"audioType": null,"audioOriginal": null,"durationSeconds": null,"likesCount": 54,"commentsCount": 1,"viewsCount": 688,"playsCount": null,"sharesCount": null,"engagementTotal": 55,"engagementRateByFollowers": 0.0048,"viewsToFollowersRatio": 0.0606,"likesToViewsRatio": 0.0785,"commentsToViewsRatio": 0.0015,"sharesToViewsRatio": null,"daysSincePublished": 24,"postingMonth": 3,"postingWeekday": "Tuesday","postingHourLocal": 6,"dateBucket": "last_30d","accountReelsSampleSize": 40,"accountAvgViewsSample": 6002.93,"accountAvgLikesSample": 176.47,"accountAvgCommentsSample": 8.65,"relativePerformanceVsAccountAvg": 0.115,"performanceBucket": "low","contentTopicHint": null,"hasQuestionInHook": false,"hasNumberInHook": true,"hasEmojiInHook": false,"hasCTA": false,"captionLengthChars": 88,"captionLengthWords": 17,"thumbnailUrl": "https://scontent-iad3-2.cdninstagram.com/v/t51.82787-15/658797984_17985064196985555_7087428163089197254_n.jpg?...","videoUrl": null,"scrapedAt": "2026-04-24T08:38:16.237Z","runId": "Y9RGT5VKVzOJPL7fa"}
The
thumbnailUrlis a signed Instagram CDN URL (time-limited). The full URL is returned in the dataset — it is truncated above only for readability.
Output field groups
All fields are scalar or simple arrays; missing values are null.
Source / account — inputUrl, sourceType, profileUsername, profileFullName, profileUrl, profileId, profileIsVerified, profileCategoryName, profileBiography, profileExternalUrl, profileFollowersCount, profileFollowingCount, profilePostsCount
Reel identity — reelId, reelShortcode, reelUrl, reelType, isPinned, publishedAt, publishedDate, publishedTimestamp
Content — caption, hookText, hookLine1, hookLengthChars, hookLengthWords, hookStyle, ctaType, hashtags[], mentions[], taggedUsers[], hashtagCount, mentionCount, languageHint, audioTitle, audioArtist, audioType, audioOriginal, durationSeconds
Performance — likesCount, commentsCount, viewsCount, playsCount, sharesCount, engagementTotal, engagementRateByFollowers, viewsToFollowersRatio, likesToViewsRatio, commentsToViewsRatio, sharesToViewsRatio
Timing / cadence — daysSincePublished, postingMonth, postingWeekday, postingHourLocal, dateBucket
Benchmarks — accountReelsSampleSize, accountAvgViewsSample, accountAvgLikesSample, accountAvgCommentsSample, relativePerformanceVsAccountAvg, performanceBucket (high / avg / low / unknown)
Hook flags + misc — contentTopicHint, hasQuestionInHook, hasNumberInHook, hasEmojiInHook, hasCTA, captionLengthChars, captionLengthWords, thumbnailUrl, videoUrl, scrapedAt, runId
Hook style values
question, how_to, list, mistake, warning, story, opinion, direct_cta, other, unknown.
CTA type values
follow, comment, dm, link_in_bio, save, share, buy, watch_more, none_detected, unknown.
Benchmarks
For profile inputs, the actor computes the sample average of views / likes / comments across the Reels it collected, then annotates each row with:
relativePerformanceVsAccountAvg=viewsCount ÷ accountAvgViewsSample(falls back to likes when views are unavailable)performanceBucket—high(>1.5×),avg(0.5–1.5×),low(<0.5×)
In the sample record above, the Reel got 688 views against an account sample average of ~6,003 views (40-Reel sample), giving a relativePerformanceVsAccountAvg of 0.115 and bucketing it as low.
For single-Reel inputs, accountReelsSampleSize = 1 and benchmarks are null.
Pricing
Pay-per-event: reel-result — charged once per Reel row pushed to the dataset. The actor respects your configured spending limit: if the limit is reached mid-run, the run stops gracefully — no further rows pushed, no further events charged.
Limitations
- Public data only. No login, no private accounts, no login-walled data.
- Some fields (
viewsCount,playsCount,sharesCount,audioArtist) are best-effort and may benullfor any given Reel. postingHourLocalreflects UTC hour, not the viewer's timezone.- All derived fields (
hookStyle,ctaType, benchmarks) are transparent, rule-based heuristics — not machine-learning classifications.
Local development
cd actornpm installnpm start # Run with INPUT.jsonnpm run dev # Run with local storage
Deployment to Apify is manual (apify push). This actor does not auto-deploy.