Instagram Single Reels & Engagement Analytics Scraper avatar

Instagram Single Reels & Engagement Analytics Scraper

Pricing

Pay per usage

Go to Apify Store
Instagram Single Reels & Engagement Analytics Scraper

Instagram Single Reels & Engagement Analytics Scraper

Scrape individual Instagram Reels with the Instagram Single Reels Scraper. Extract video URLs, captions, hashtags, likes, comments, and uploader info. Perfect for content analysis, trend tracking, and social media research. Fast, accurate, and easy to use for single or multiple Reels.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Scrapier

Scrapier

Maintained by Community

Actor stats

0

Bookmarked

9

Total users

3

Monthly active users

5 days ago

Last modified

Share

Instagram Reel Scraper — Media, Comments and Engagement Analytics

Instagram Single Reels & Engagement Analytics Scraper pulls owner, caption, media, and comment-sample data for any public Instagram reel you list by URL or shortcode, logged out, then computes engagement rate, like-to-play ratio, comment-to-like ratio, and posting velocity directly from those same counts. Every response is structured JSON — ready to pass to an LLM, load into a spreadsheet, or feed a monitoring pipeline. Set minimum thresholds and only reels that clear your bar reach the dataset.

What is Instagram Single Reels & Engagement Analytics Scraper?

It is a batch reel scraper: give it a list of reel URLs, usernames/shortcodes, or bare shortcodes, and for each one it returns flattened owner, caption, media, and comment-sample fields plus five derived engagement metrics computed locally from the like count, comment count, play count, and post timestamp already in the fetch — no extra request, no scoring model, no login. No Instagram account is required to run it; an optional session cookie can be supplied but the fetch is verified working fully logged out.

  • Fetches owner identity, caption, media URLs, and a comments sample per reel
  • Computes engagementRate, likeToPlayRatio, commentToLikeRatio, engagementVelocityPerDay, and daysSincePost from the same fetch, with no faked values when an input metric is missing
  • Filters output by minimum like count, play count, comment count, or engagement rate before rows reach the dataset
  • Accepts full URLs, username/shortcode pairs, or bare shortcodes in the same input list
  • Writes a typed, uncharged accounting row for every blocked or failed URL instead of silently skipping it
  • Retries on a freshly rotated residential proxy IP when a request or soft block fails

What data can you get with Instagram Single Reels & Engagement Analytics Scraper?

Each run returns one row per input reel, covering identity, content, media, raw engagement counts, derived engagement analytics, comment sampling, and run metadata.

Result TypeExtracted FieldsPrimary Use Case
Identityurl, shortcode, ownerUsername, ownerFullName, ownerIsVerifiedAttribute a reel to its creator
ContentcaptionText, takenAtIso, isPaidPartnership, mediaType, productType, hasAudioClassify and read the post itself
MediavideoUrlBest, thumbnailUrlPull the highest-resolution video/image asset
Raw countslikeCount, commentCount, playCountBaseline volume metrics as fetched
Engagement analyticsengagementRate, likeToPlayRatio, commentToLikeRatio, engagementVelocityPerDay, daysSincePostRank or qualify reels by performance, not just size
CommentscommentsSampleCountGauge comment-section activity at a glance
Run metadataproxy_used, success, errorType, scrapedAtAudit which URLs succeeded, failed, or were filtered

Engagement analytics

engagementRate, likeToPlayRatio, and commentToLikeRatio are arithmetic on the same like/comment/play counts the fetch already returns — no separate insights call. engagementVelocityPerDay divides total (likes + comments) by daysSincePost, which is floored at one hour so a reel posted minutes ago doesn't produce an inflated spike. Instagram's logged-out fetch frequently omits play count; when that happens, engagementRate and likeToPlayRatio are returned as null — never estimated or backfilled — while commentToLikeRatio and engagementVelocityPerDay, which don't depend on plays, still compute normally. This null-over-fake rule also governs the threshold filters: a row with a missing metric always passes its filter rather than being dropped on an assumed zero.

{
"likeCount": 1806539,
"commentCount": 20505,
"playCount": null,
"engagementRate": null,
"likeToPlayRatio": null,
"commentToLikeRatio": 0.0111,
"engagementVelocityPerDay": 5240.12,
"daysSincePost": 312.7
}

Comments sample

Each response also carries commentsSampleCount, the size of the small preview_comments list Instagram's own GraphQL response includes inline with the media data — no separate comments-endpoint request is made, since that private endpoint redirects to a login wall when called logged out. This gives a lightweight read on comment-section activity without a second fetch per reel, useful as a quick sentiment or activity spot-check alongside the engagement numbers.

How does Instagram Single Reels & Engagement Analytics Scraper differ from the official Instagram API?

Instagram's Graph API returns insights only for content owned by an authenticated Business or Creator account; it cannot pull data for an arbitrary public reel posted by another account, which is exactly this Actor's use case.

FeatureInstagram Graph APIInstagram Single Reels & Engagement Analytics Scraper
Account requiredBusiness/Creator account linked to a Facebook Page, plus an access tokenNone — runs logged out by default
Content scopeOnly media owned by the authenticated accountAny public reel, by URL or shortcode
Engagement metricsRaw insight counts for owned contentComputed engagement rate, ratios, and velocity for any public reel
Batch inputScoped to the account's own media IDsArray of reelUrls in a single run
SetupApp review, token refresh, Business verificationPaste reel URLs and start the run
Output shapeNested Graph API objects per endpointFlattened typed columns, plus uncharged error rows for failed URLs

The Graph API is the right tool when you own the content and already have a verified Business account. This Actor is the right tool when you need engagement data on reels you don't own or aren't a collaborator on, without any app review process.

How to scrape Instagram with Instagram Single Reels & Engagement Analytics Scraper?

  1. Open the Actor's page on the Apify Store and click Try for free (or Run, if you already have it saved).
  2. Add one or more reel inputs to reelUrls — a full URL, a username/shortcode pair, or a bare shortcode.
  3. Set any engagement threshold filters you want (minLikeCount, minPlayCount, minCommentCount, minEngagementRate); leave them at 0 to keep everything.
  4. Start the run.
  5. Download the dataset as JSON, CSV, or Excel, or read it back via the Apify API.
{
"reelUrls": [
"https://www.instagram.com/cristiano/reel/DOEMHa6iPoz/",
"cristiano/DOEMHa6iPoz"
],
"minEngagementRate": 0.02
}

How to run multiple queries in one job

reelUrls accepts an array, so a single run can process any number of reels — mix full URLs, username/shortcode pairs, and bare shortcodes in the same list. Each reel is fetched sequentially, with a short randomized delay between requests, so a batch of reels from different creators can be queued in one job instead of one run per reel.

⬇️ Input

ParameterRequiredTypeDescriptionExample Value
reelUrlsNoarrayReel inputs to analyze: full URL, username/shortcode, or bare shortcode. Legacy urls field also accepted.["cristiano/DOEMHa6iPoz"]
minLikeCountNointegerDrop reels with fewer likes than this. Default 0 = no filtering.1000
minPlayCountNointegerDrop reels with fewer plays than this. A null play count always passes. Default 0.50000
minCommentCountNointegerDrop reels with fewer comments than this. Default 0.100
minEngagementRateNonumberDrop reels whose engagementRate = (likes + comments) / plays is below this. A null rate always passes. Default 0.0.02
proxyConfigurationNoobjectProxy settings. Always uses RESIDENTIAL proxy regardless of group selected; only the country is honored.{"useApifyProxy": true, "apifyProxyCountry": "US"}
sessionIdNostring (secret)Optional Instagram sessionid cookie. Not required — the fetch is verified working fully logged out.(leave empty)

No parameter is required — an empty run simply has nothing to process.

{
"reelUrls": [
"https://www.instagram.com/cristiano/reel/DOEMHa6iPoz/",
"cristiano/DOEMHa6iPoz"
],
"minLikeCount": 0,
"minPlayCount": 0,
"minCommentCount": 0,
"minEngagementRate": 0,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"],
"apifyProxyCountry": "US"
}
}

Pitfall: setting minPlayCount or minEngagementRate above 0 does not guarantee every low-performing reel gets dropped. Instagram frequently omits play count on a logged-out fetch, and a null value always passes both filters by design (it's treated as unknown, not zero) — so a reel with no visible play count can still reach the dataset even above your threshold.

⬆️ Output

Results are written to a typed, consistent Apify dataset — every row shares the same schema whether it succeeded, was filtered, or failed, and can be exported as JSON, CSV, Excel, or accessed via the API.

Scraped results

[
{
"url": "https://www.instagram.com/cristiano/reel/DOEMHa6iPoz/",
"shortcode": "DOEMHa6iPoz",
"ownerUsername": "cristiano",
"ownerFullName": "Cristiano Ronaldo",
"ownerIsVerified": true,
"isPaidPartnership": true,
"captionText": "I came here to do what I love, but I #StayedForMore...",
"takenAtIso": "2025-09-01T15:01:00Z",
"likeCount": 1806539,
"commentCount": 20505,
"playCount": null,
"engagementRate": null,
"likeToPlayRatio": null,
"commentToLikeRatio": 0.0111,
"engagementVelocityPerDay": 5240.12,
"daysSincePost": 312.7,
"videoUrlBest": "https://instagram.ftun10-1.fna.fbcdn.net/o1/v/t2/f2/m86/example.mp4",
"thumbnailUrl": "https://instagram.ftun10-1.fna.fbcdn.net/v/t51.71878-15/example.jpg",
"mediaType": 2,
"productType": "clips",
"hasAudio": true,
"commentsSampleCount": 2,
"proxy_used": "residential",
"success": true,
"errorType": null,
"scrapedAt": "2026-07-26T09:00:00Z"
},
{
"url": "https://www.instagram.com/nasa/reel/C1abcDEfghi/",
"shortcode": "C1abcDEfghi",
"ownerUsername": "nasa",
"ownerFullName": "NASA",
"ownerIsVerified": true,
"isPaidPartnership": false,
"captionText": "A new view of the Orion Nebula, captured this week.",
"takenAtIso": "2026-06-10T18:22:00Z",
"likeCount": 412300,
"commentCount": 3891,
"playCount": 5200000,
"engagementRate": 0.080018,
"likeToPlayRatio": 0.079288,
"commentToLikeRatio": 0.009438,
"engagementVelocityPerDay": 8892.4,
"daysSincePost": 46.8,
"videoUrlBest": "https://instagram.ftun10-1.fna.fbcdn.net/o1/v/t2/f2/m86/example2.mp4",
"thumbnailUrl": "https://instagram.ftun10-1.fna.fbcdn.net/v/t51.71878-15/example2.jpg",
"mediaType": 2,
"productType": "clips",
"hasAudio": true,
"commentsSampleCount": 3,
"proxy_used": "residential",
"success": true,
"errorType": null,
"scrapedAt": "2026-07-26T09:01:12Z"
},
{
"url": "https://www.instagram.com/someone/reel/abc12345/",
"shortcode": null,
"ownerUsername": null,
"ownerFullName": null,
"ownerIsVerified": null,
"isPaidPartnership": null,
"captionText": null,
"takenAtIso": null,
"likeCount": null,
"commentCount": null,
"playCount": null,
"engagementRate": null,
"likeToPlayRatio": null,
"commentToLikeRatio": null,
"engagementVelocityPerDay": null,
"daysSincePost": null,
"videoUrlBest": null,
"thumbnailUrl": null,
"mediaType": null,
"productType": null,
"hasAudio": null,
"commentsSampleCount": null,
"proxy_used": "none",
"success": false,
"errorType": "login_required",
"scrapedAt": "2026-07-26T09:02:30Z"
}
]

The third item is an uncharged accounting row: Instagram declined to return usable tokens for that URL after retries, so the run reports exactly which reel failed and why instead of producing silence. Only rows that succeed and clear every threshold filter are billed under the row_result event.

How can I use the data extracted with Instagram Single Reels & Engagement Analytics Scraper?

  • Content performance research: compare engagementRate and engagementVelocityPerDay across a batch of reels to see which posts are genuinely outperforming their raw like counts, not just which have the biggest audience.
  • Creator vetting: before a brand deal, pull a creator's recent reel URLs and check commentToLikeRatio and engagementVelocityPerDay alongside ownerIsVerified and isPaidPartnership to spot inflated-looking engagement.
  • AI engineers and LLM developers: an agent takes a list of reel URLs, calls this Actor, and passes the structured JSON — including the derived metrics — to a model as grounded context for a summary or ranking task.
  • Trend tracking: re-scrape the same reel list on a schedule and diff likeCount, commentCount, and engagementVelocityPerDay between runs to see which reels are still accelerating versus flattening out.

How do you monitor reel engagement over time?

Engagement monitoring here means re-scraping the same list of reel URLs on a schedule and comparing the derived metrics between runs, rather than treating a single fetch as a final answer. Because engagementRate, likeToPlayRatio, commentToLikeRatio, and engagementVelocityPerDay are recomputed fresh on every run from the reel's current like/comment/play counts, a series of runs turns a single snapshot into a trend line.

The fields worth diffing between runs are likeCount, commentCount, playCount, engagementRate, and engagementVelocityPerDay. A rising engagementVelocityPerDay on a reel that's already a few days old usually signals a late algorithmic push or a resurfacing; a flat or falling engagementRate alongside rising playCount can flag a reel that's gaining views without gaining proportional engagement.

A practical loop: keep a fixed list of reel URLs (your own content, a competitor's, or a set you're tracking for a campaign), run this Actor against that list on a schedule, and store each run's dataset keyed by shortcode and scrapedAt. Compare each new run's engagementRate and engagementVelocityPerDay against the previous run for the same shortcode, and alert when the delta crosses whatever threshold matters for your use case — a sharp velocity increase, or an engagement rate that's dropped below your minEngagementRate filter.

Scheduling itself isn't built into the Actor — set it up with Apify's own Schedules feature (cron-based recurring runs) pointed at this Actor, or trigger it from your own orchestration on whatever interval fits your monitoring cadence.

Integrate Instagram Single Reels & Engagement Analytics Scraper and automate your workflow

Instagram Single Reels & Engagement Analytics Scraper works with any language or tool that can send an HTTP request, through the standard Apify API.

REST API with Python

import requests
TOKEN = "YOUR_APIFY_TOKEN"
url = f"https://api.apify.com/v2/acts/Scrapier~instagram-single-reels-engagement-analytics-scraper/run-sync-get-dataset-items?token={TOKEN}"
payload = {
"reelUrls": ["cristiano/DOEMHa6iPoz"],
"minEngagementRate": 0.02,
}
response = requests.post(url, json=payload)
reels = response.json()
for reel in reels:
print(reel["shortcode"], reel["engagementRate"], reel["engagementVelocityPerDay"])

MCP for query-grounded AI agents

This Actor is callable through Apify's MCP server (https://mcp.apify.com), which exposes any Apify Actor — including Scrapier/instagram-single-reels-engagement-analytics-scraper — as a tool an MCP-compatible client can invoke directly. An agent in Claude Desktop, Claude Code, or another MCP client receives a question about a reel, calls the Actor with the reel URL, and grounds its answer in the returned engagement fields instead of guessing.

Scheduled monitoring and delivery

Use Apify's Schedules to trigger recurring runs against a fixed reel list on a cron interval, and read results back via the API or dataset export after each run. Apify webhooks can also notify your system when a run finishes, so a downstream job can pull the fresh dataset without polling.

Scraping publicly visible Instagram reel data is generally legal — this Actor only reads what any logged-out visitor's browser can already load, without bypassing a login or using stolen credentials. Owner usernames, full names, and captions are personal data under GDPR and CCPA, so how you store, process, and reuse the extracted rows — not the act of reading a public page — is where legal obligations attach. Bulk collection and long-term storage of creator data for profiling or resale carries different obligations than a one-off engagement check on a handful of reels, and training an AI model on scraped personal data raises separate considerations from a short-lived monitoring run. This Actor does not require or use Instagram account credentials to operate. Consult your legal team for commercial use cases involving bulk data storage or reuse of creator personal data.

Frequently asked questions

How is engagement rate actually calculated, and why is it sometimes null?

engagementRate = (likeCount + commentCount) / playCount, computed locally from the same counts the fetch already returns — no separate insights call or scoring model. It's null whenever Instagram's logged-out response omits play count, which happens frequently; the Actor never estimates or substitutes a fake value, so a null always means "unknown," not zero.

Can I control which country the residential proxy exits from?

Yes, via proxyConfiguration.apifyProxyCountry. The Actor always uses a RESIDENTIAL proxy regardless of which proxy group you select — only the country is honored from your configuration.

How do the engagement threshold filters work together?

minLikeCount, minPlayCount, minCommentCount, and minEngagementRate are all applied to the same row — a reel must clear every threshold you set above 0 to reach the dataset. A metric that comes back null (most often playCount and engagementRate) always passes its own filter rather than being dropped as if it were zero.

How does this Actor handle Instagram's anti-bot measures?

It fetches a public profile page for its x-ig-app-id and x-csrftoken tokens, then uses those tokens to call Instagram's own logged-out GraphQL endpoint for the reel — no login wall triggered by that path as of this writing. If a request or token fetch fails or comes back as a soft block, it retries up to 3 times on a freshly rotated residential proxy IP before reporting the URL as failed.

Does it extract engagement analytics for every reel?

Yes, for every reel it successfully fetches — engagementRate, likeToPlayRatio, commentToLikeRatio, engagementVelocityPerDay, and daysSincePost are computed on every successful row. engagementRate and likeToPlayRatio specifically depend on a non-null play count, so they're absent (null) when Instagram doesn't expose one on that fetch.

How many reels can I scrape per run, and how long does it take?

There's no fixed cap in the input schema — reelUrls accepts an array of any length. Each reel is processed sequentially with a short randomized delay before its token fetch and a further delay between items, so total run time scales roughly linearly with the number of reels in the list.

How do I monitor a reel's engagement over time?

Run the same reel list on a recurring schedule (via Apify's Schedules feature), and compare engagementRate, engagementVelocityPerDay, likeCount, and commentCount for each shortcode against its previous run. Alert on whatever delta matters — a velocity spike, or engagement rate crossing your minEngagementRate threshold.

Does it work with Claude, ChatGPT, and AI agent frameworks?

Yes. It's reachable through Apify's MCP server for MCP-compatible clients like Claude Desktop and Claude Code, and callable as a plain HTTP endpoint by any agent framework that can send a request — either path lets an agent retrieve current reel engagement data before generating an answer.

How does this Actor compare to other Instagram reel scrapers?

Most reel scrapers return the counts Instagram's page or API exposes as-is — likes, comments, and views. This Actor returns those same raw counts plus five metrics (engagement rate, like-to-play ratio, comment-to-like ratio, engagement velocity, and days since posting) computed from them, along with a typed error row for every failed URL instead of a silently missing result.

Can I use this Actor without managing proxies or an Instagram login?

Yes. It always routes requests through Apify's residential proxy network automatically, and the fetch is verified working fully logged out — no Instagram account, session, or password is required. An optional sessionId cookie can be supplied but is not needed for the Actor to return data.

Your feedback

Found a bug or a field that doesn't match what Instagram actually returns? Let us know through the Actor's Issues tab on Apify or the Scrapier support channel on the Apify Store — reports like this go straight into the next update.