Instagram Reel Hooks & Competitor Analyzer avatar

Instagram Reel Hooks & Competitor Analyzer

Pricing

from $1.80 / 1,000 reel results

Go to Apify Store
Instagram Reel Hooks & Competitor Analyzer

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

Delowar Munna

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 days ago

Last modified

Share

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.

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

  1. Input — provide public profile URLs, bare usernames, or direct Reel URLs.
  2. Profile fetch — for each profile, call Instagram's public web_profile_info endpoint and the Reels tab endpoint to collect up to maxReelsPerProfile recent Reels.
  3. Direct Reel fetch — for each Reel URL, resolve the shortcode and fetch /api/v1/media/{id}/info/.
  4. Normalize — extract a stable set of fields from whatever shape Instagram returned.
  5. Derive — compute hook text, hook style, CTA type, hashtags/mentions, cadence, ratios, and sample benchmarks.
  6. Export — push one flat row per Reel to the dataset.

Inputs

FieldTypeDefaultDescription
startUrlsstring[]requiredProfile URLs, bare usernames, or Reel URLs (mix freely)
maxReelsPerProfileint20Cap Reels per profile input
dateFromISO dateOnly include Reels published on/after this date
dateToISO dateOnly include Reels published on/before this date
skipPinnedReelsbooltrueSkip pinned Reels (they distort benchmarks)
includeProfileContextbooltrueEmit profile* fields on every row
includeDerivedFieldsbooltrueEmit hookStyle, ctaType, ratios, benchmarks
includeHashtagsArraybooltrueEmit hashtags as array
includeMentionsArraybooltrueEmit mentions as array
includeAudioFieldsbooltrueEmit audioTitle, audioArtist, audioType, audioOriginal
includeVideoUrlboolfalseEmit best-effort signed video URL
requestTimeoutSecsint300Per-request timeout
maxConcurrencyint1Concurrent inputs
debugModeboolfalseVerbose 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.

Reel Rows table view

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 thumbnailUrl is 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 / accountinputUrl, sourceType, profileUsername, profileFullName, profileUrl, profileId, profileIsVerified, profileCategoryName, profileBiography, profileExternalUrl, profileFollowersCount, profileFollowingCount, profilePostsCount

Reel identityreelId, reelShortcode, reelUrl, reelType, isPinned, publishedAt, publishedDate, publishedTimestamp

Contentcaption, hookText, hookLine1, hookLengthChars, hookLengthWords, hookStyle, ctaType, hashtags[], mentions[], taggedUsers[], hashtagCount, mentionCount, languageHint, audioTitle, audioArtist, audioType, audioOriginal, durationSeconds

PerformancelikesCount, commentsCount, viewsCount, playsCount, sharesCount, engagementTotal, engagementRateByFollowers, viewsToFollowersRatio, likesToViewsRatio, commentsToViewsRatio, sharesToViewsRatio

Timing / cadencedaysSincePublished, postingMonth, postingWeekday, postingHourLocal, dateBucket

BenchmarksaccountReelsSampleSize, accountAvgViewsSample, accountAvgLikesSample, accountAvgCommentsSample, relativePerformanceVsAccountAvg, performanceBucket (high / avg / low / unknown)

Hook flags + misccontentTopicHint, 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)
  • performanceBuckethigh (>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 be null for any given Reel.
  • postingHourLocal reflects 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 actor
npm install
npm start # Run with INPUT.json
npm run dev # Run with local storage

Deployment to Apify is manual (apify push). This actor does not auto-deploy.