π¬ Instagram Singel Reels : Virality Intelligence Scraper
Pricing
$19.99/month + usage
π¬ Instagram Singel Reels : Virality Intelligence Scraper
Instagram Single Reels Scraper fetches complete insights from one Reel linkβcaptions, hashtags, mentions, views, likes, comments, thumbnails, video URL, and music data. Get clean JSON output for analytics, growth tracking, influencer audits, or competitive benchmarking at scale.
Pricing
$19.99/month + usage
Rating
5.0
(1)
Developer
Scraper Engine
Maintained by CommunityActor stats
1
Bookmarked
69
Total users
4
Monthly active users
5 days ago
Last modified
Categories
Share
Instagram Singel Reels β Engagement Rate, Virality Flag & MP4
Paste an Instagram Reel URL and get back a structured JSON row with engagementRate, viralFlag, likesPerHour, originalAudioTitle, hashtags, and a durable videoKvUrl for a no-watermark MP4 β no HTML parsing required. Every metric is pure math computed from the real likeCount, commentCount, and view/play counts Instagram serves for that reel; nothing is estimated or inferred. Start a run from the Actor's Apify Console page below and get results in seconds.
What is Instagram Reel Virality Intelligence Scraper?
Instagram Reel Virality Intelligence Scraper turns one or more Reel URLs (or shortcodes) into a benchmarked performance scorecard plus a durable, no-watermark media archive. It flattens Instagram's raw reel payload into a flat schema, computes engagement and velocity metrics from the counts that come back, extracts audio-trend and caption-NLP context, and β on request β pages deeper into the comment thread than the ~12 comments Instagram shows inline. Public reel pages need no Instagram account or login; login only comes into play if Instagram serves a challenge wall to the request (see sessionId below). It's built for social media managers, growth marketers, and AI engineers who need reel performance data as clean JSON rather than a scraped webpage.
What Instagram reel data is publicly available to scrape?
Instagram serves reel metadata, engagement counts, caption text, audio metadata, and the video/thumbnail assets themselves to any visitor without logging in β that's the surface this Actor reads.
| Data Category | Publicly Available | Restricted (requires login) |
|---|---|---|
| Caption, hashtags, mentions, links | Yes | β |
| Like, comment, view/play counts | Yes (view/play counts are sometimes withheld by Instagram itself) | β |
| Owner username, verification, private flag | Yes | Owner's full profile (followers, other posts) |
| Audio/music metadata, trending-audio flag | Yes | β |
| Tagged users, co-author producers, paid-partnership sponsor tags | Yes | β |
| Video and thumbnail media (best available quality) | Yes | β |
| Top-level comments | Yes, continuing past the inline ~12 via the real comment connection | Comment replies beyond childCommentCount, DMs |
| Stories, close-friends content | β | Login required |
Instagram Reel Virality Intelligence Scraper only returns publicly visible data β what any visitor sees. Nothing behind a login wall. The optional sessionId input is used only as a fallback Cookie header when Instagram serves a login/challenge wall to the request IP β it does not unlock private accounts.
What data can I extract with Instagram Reel Virality Intelligence Scraper?
Instagram Reel Virality Intelligence Scraper returns one flat JSON row per reel (type: "reel") plus, if comments are enabled, one row per comment (type: "comment", isChild: true). Every field below is read straight off the object the row-building function (flatten_media / flatten_comment in src/main.py) writes β not just the 34 columns shown in the default dataset view.
Identity, caption and media-format fields
| Field Name | Description |
|---|---|
shortcode | Reel's Instagram shortcode |
mediaId / mediaGraphId | Numeric media pk and GraphQL media id |
url | The reel URL that was scraped |
ownerUsername / ownerId / ownerFullName | Poster's username, numeric id, display name |
ownerIsVerified / ownerIsPrivate | Poster's verified badge and private-account flag |
takenAt (ISO 8601) / takenAtTimestamp (Unix) | When the reel was posted |
caption | Full caption text |
captionLanguage | Deterministic script/keyword language guess (never via an LLM) |
hashtags / mentions / links | Arrays parsed from the caption text |
productType / mediaType / mediaTypeName | Instagram's raw type code plus a decoded label (image/video/carousel) |
width / height | Original media dimensions |
hasAudio | Whether the reel has an audio track |
numberOfQualities | Count of video quality renditions Instagram published |
Virality scorecard and engagement metrics
| Field Name | Description |
|---|---|
likeCount / commentCount | Real counts as returned by Instagram |
viewCount / playCount / reshareCount | Raw view/play/reshare counts (often null β Instagram frequently withholds view_count on the public reel page) |
viewsResolved | The first non-null of play_count, ig_play_count, view_count, reshare_count β the figure actually used in the metrics below |
viewCountField | Which of those four fields viewsResolved came from |
engagementRate | (likeCount + commentCount) Γ· viewsResolved Γ 100, only computed when a real view figure exists |
engagementRateBasis | engagement/<field> when a real view field was used, or like_comment_fallback (no real view field) when it wasn't |
likeToCommentRatio | likeCount Γ· commentCount, rounded |
commentsPer1kViews | commentCount Γ· viewsResolved Γ 1000 |
viralFlag | true when engagementRate >= 3.0 β a published heuristic threshold (Later/Hootsuite guidance), only ever set when a real engagementRate exists |
viralBenchmark | The literal benchmark string used for the flag |
postAgeHours / postAgeDays | Age of the reel at scrape time, derived from takenAt |
likesPerHour / commentsPerHour / viewsPerHour | Velocity metrics β viewsPerHour only when viewsResolved is real |
Audio trend, media archive, tags and run metadata
| Field Name | Description |
|---|---|
audioType / isOriginalAudio | Instagram's audio classification and whether it's the reel's own original audio |
originalAudioTitle / audioAssetId | Original-sound title and asset id |
audioArtistUsername / audioArtistId | Original-sound artist, when set |
isExplicitAudio | Explicit-content audio flag |
isTrendingInClips | Whether Instagram flags the audio as trending in Reels |
musicTitle / musicArtist | Licensed-music title/artist, when the reel uses one |
formattedClipsMediaCount | Number of other reels using the same audio (present only when Instagram supplies it) |
videoUrl / videoWidth / videoHeight | Best-quality source video URL and dimensions |
thumbnailUrl | Best-quality source thumbnail URL |
renditions | Parsed width/height/bitrate/quality-label ladder from the DASH manifest β only present when includeRenditions is on |
videoKvUrl / thumbnailKvUrl | Durable key-value-store links to the downloaded MP4/thumbnail β only present when saveMedia is on and the download succeeded |
videoBytes / thumbnailBytes | Byte size of the archived files β only present when saveMedia downloaded them |
taggedUsers[] / coauthorProducers[] | Username, id, full name and verified flag for tagged users and reel co-authors |
isPaidPartnership / sponsorTags | Paid-partnership flag and sponsor username/id/full-name list |
aiTopic / aiSentiment / aiHookType | Only present when aiEnhancement is on and classification succeeded |
commentsFetched / commentsPaginationMethod | How many comments were fetched and which pagination path returned them (graphql, api_v1, inline_only, not_requested, or none) |
proxyUsed | residential or none, whichever the request actually used |
success | true only when the row carries real shortcode + ownerUsername data (see pay-per-event below) |
scrapedAt | UTC timestamp of the scrape |
Comment row fields (type: "comment")
| Field Name | Description |
|---|---|
commentId | Comment's numeric pk |
parentShortcode / parentMediaId / parentUrl | Links the comment back to its parent reel |
authorUsername / authorId / authorIsVerified | Commenter's username, id, verified flag |
text | Comment text |
createdAt (ISO) / createdAtTimestamp (Unix) | When the comment was posted |
childCommentCount | Number of replies under the comment |
commentLikeCount | Likes on the comment |
scrapedAt | UTC timestamp of the scrape |
π€ Add-on: Need additional Instagram data?
Pair this Actor with Instagram Tagged Posts Scraper Plus to pull everything an account is tagged in, Instagram Followers β© Following β Mutuals & Fans to map an account's audience, or Instagram B2B Lead & Contact Scraper to turn profile bios into outreach-ready contact data.
How does Instagram Reel Virality Intelligence Scraper differ from the official Instagram API?
Meta's official Graph API for Reels only returns media owned by the Facebook Page-connected professional account making the call β it cannot fetch another account's public reel the way this Actor does with just a URL. Instagram Reel Virality Intelligence Scraper reads the same public reel page any logged-out visitor sees, so it works on any public reel, not only your own.
| Feature | Instagram Graph API | Instagram Reel Virality Intelligence Scraper |
|---|---|---|
| Access to other accounts' reels | β β only the connected Page/Instagram professional account's own media | β β any public reel by URL or shortcode |
| Setup | OAuth app registration, Facebook Page linkage, app review | Provide the reel URL and start the run |
| Derived virality metrics (engagement rate, viral flag, velocity) | β β raw insights fields only | β β computed on every row |
| No-watermark video/thumbnail archival | β | β
(saveMedia) |
| Deep comment pagination past inline count | Limited to endpoints on owned media | β
on any public reel (includeComments) |
| Audio-trend and caption NLP fields | β | β |
Use the Graph API when you manage the account and need first-party Insights against your own reels. Use Instagram Reel Virality Intelligence Scraper when you need virality benchmarking, media archival, or comment data on reels you don't own.
How to use Instagram Reel Virality Intelligence Scraper
No account or API key is required to run it β only an Apify account to start the run.
- Open Instagram Reel Virality Intelligence Scraper on the Apify Store and click Try for free.
- Provide the required
urlsinput β a full reel URL, ausername/shortcodepair, or a bare shortcode. - Turn on
includeComments,saveMedia,includeRenditions, oraiEnhancementif you want those extras; leave them off for the fastest, cheapest run. - Start the run from the Console (or via the API / a schedule).
- Download results as JSON or CSV from the run's dataset, or stream them via the API.
How to scale to bulk reel extraction
urls is an array (editor: "stringList"), so a single run accepts as many reel URLs, shortcodes, or username/shortcode pairs as you paste in β one row per reel, one run. Use maxItems to cap how many of them actually get scraped (comments don't count against that cap). There is no separate bulk-input mode beyond the array itself; for very large lists, split across a few runs or use an Apify schedule to spread them over time.
What can you do with Instagram reel data?
- π Social media managers benchmarking a content calendar use
engagementRateandviralFlagto identify which reels actually outperformed the account'sviralBenchmark, not just which have the most raw likes. - π― Growth marketers vetting influencer partnerships use
likesPerHour,postAgeDaysandisTrendingInClipsto judge whether a reel's traction was fast and organic or a slow accumulation. - π΅ Trend researchers use
originalAudioTitle,isTrendingInClipsandformattedClipsMediaCountto spot audio that's currently driving reach across many creators. - π€ Brand-safety and disclosure teams use
isPaidPartnershipandsponsorTagsto audit whether influencer content is properly disclosed. - π€ AI engineers feed
caption,hashtags, andcommentsPaginationMethod-verified comment text into a RAG index or an agent tool to answer questions like "which of this account's reels mention our product" without re-scraping.
How does Instagram Reel Virality Intelligence Scraper handle rate limits and blocking?
Every reel request always routes through Apify's RESIDENTIAL proxy group (hardcoded in the Actor, with an optional country pin via proxyConfiguration). If a fetch attempt fails or comes back blocked, the Actor rotates to a fresh residential IP and retries β up to 12 attempts per reel β with a randomized delay between attempts so requests aren't machine-regular. For the higher-security media-info endpoint, it mints a stable-per-run mobile (Android app) device identity β a consistent device id, Android id and app header set β because a web identity hitting that endpoint triggers Instagram's unsupported_version challenge; if you supply sessionId, requests are made as that logged-in session instead. If a reel still can't be fetched after all retries, the Actor logs a warning and moves on to the next URL rather than failing the whole run; a reel that comes back with partial data (missing shortcode or ownerUsername) is still pushed to the dataset but marked success: false and not charged.
β¬οΈ Input
All fields below are read directly from the Actor's input schema. Only urls is required.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
urls | Yes | array | List of reels to scrape. Accepts full URLs (https://www.instagram.com/cristiano/reel/DOEMHa6iPoz/), username/shortcode (cristiano/DOEMHa6iPoz), or a bare shortcode (DOEMHa6iPoz). maxItems counts these reels only; comments are additional. | ["https://www.instagram.com/cristiano/reel/DOEMHa6iPoz/"] |
maxItems | No | integer | Maximum number of reels (parent rows) to scrape. Comments do NOT count against this. 0 = no limit. Default 0. | 10 |
includeComments | No | boolean | Fetch comments for each reel (top-level rows, linked to the parent via parentMediaId), continuing past the ~12 shown inline. Default false. | true |
maxComments | No | integer | Cap on comments fetched per reel when includeComments is on. Public depth is roughly 100β300. 0 disables comment fetching. Default 50. | 100 |
saveMedia | No | boolean | Download the best-quality no-watermark MP4 and thumbnail on the same residential IP and store them in the key-value store, returning durable videoKvUrl / thumbnailKvUrl. Default false. | true |
includeRenditions | No | boolean | Emit a compact parsed renditions ladder (width/height/bitrate/quality label from the DASH manifest) instead of the bulky manifest XML. Default false. | false |
aiEnhancement | No | boolean | OFF by default. When on, classifies the real scraped caption into topic/sentiment/hook-type via the selected provider. The virality core needs no AI. Requires an API key. | false |
aiModel | No | string (enum) | Model/provider for caption classification, auto-detected from the name prefix (claude-*=Anthropic, gpt-*/o1/o3=OpenAI, gemini-*=Google, grok-*=xAI, deepseek-*=DeepSeek, sonar*=Perplexity, mistral-*=Mistral). Default claude-haiku-4-5. Full enum: claude-haiku-4-5, claude-sonnet-5, claude-opus-4-8, claude-fable-5, gpt-4o-mini, gpt-4o, gpt-4.1-mini, gpt-4.1, o3-mini, o1, gemini-2.0-flash-lite, gemini-2.0-flash, gemini-2.5-flash, gemini-2.5-pro, grok-3-mini, grok-3, deepseek-chat, sonar, sonar-pro, mistral-small-latest, mistral-large-latest. | claude-haiku-4-5 |
aiApiKey | No | string (secret) | API key for the selected provider. Falls back to env var ANTHROPIC_API_KEY / OPENAI_API_KEY / GEMINI_API_KEY / XAI_API_KEY / DEEPSEEK_API_KEY / PERPLEXITY_API_KEY / MISTRAL_API_KEY. Only used when aiEnhancement is on. | sk-ant-... |
sessionId | No | string (secret) | Optional logged-in Instagram sessionid cookie value, used only as a Cookie header over the residential proxy if Instagram serves a login/challenge wall. Falls back to the IG_SESSIONID env var. Leave empty for logged-out scraping. | (empty) |
proxyConfiguration | No | object | This Actor always routes reel requests through Apify RESIDENTIAL proxies. You may pin a country here. | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US"} |
Example input
{"urls": ["https://www.instagram.com/cristiano/reel/DOEMHa6iPoz/","natgeo/DOc7L1WoW3F"],"maxItems": 2,"includeComments": true,"maxComments": 100,"saveMedia": true,"includeRenditions": false,"aiEnhancement": true,"aiModel": "claude-haiku-4-5","aiApiKey": "sk-ant-your-key-here","sessionId": "","proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountry": "US"}}
β¬οΈ Output
Results are typed, normalized JSON with a consistent schema across runs β one row per reel and, if includeComments is on, one additional row per comment. Comment rows are also mirrored to a per-run comments-<runId> dataset. Export results as JSON, CSV, Excel, XML, HTML or RSS directly from the Apify Console, or read them programmatically via the API.
Example output
[{"type": "reel","isChild": false,"url": "https://www.instagram.com/cristiano/reel/DOEMHa6iPoz/","shortcode": "DOEMHa6iPoz","mediaId": "3452981176004521234","ownerUsername": "cristiano","ownerIsVerified": true,"takenAt": "2026-06-12T14:03:21Z","caption": "Great win for the team today! #football #motivation","hashtags": ["football", "motivation"],"mentions": [],"captionLanguage": "en","likeCount": 842103,"commentCount": 6120,"viewCount": null,"playCount": 15230411,"viewsResolved": 15230411,"viewCountField": "play_count","engagementRate": 5.5721,"engagementRateBasis": "engagement/play_count","likeToCommentRatio": 137.6,"commentsPer1kViews": 0.4019,"viralFlag": true,"viralBenchmark": "engagement_rate >= 3.0% (Later/Hootsuite heuristic)","postAgeDays": 1.42,"likesPerHour": 24709.5,"isTrendingInClips": true,"originalAudioTitle": "Original audio","isPaidPartnership": false,"taggedUsers": [],"videoUrl": "https://scontent.cdninstagram.com/v/.../video.mp4","videoKvUrl": "https://api.apify.com/v2/key-value-stores/abc123/records/video-DOEMHa6iPoz.mp4","thumbnailKvUrl": "https://api.apify.com/v2/key-value-stores/abc123/records/thumb-DOEMHa6iPoz.jpg","commentsFetched": 100,"commentsPaginationMethod": "graphql","proxyUsed": "residential","success": true,"scrapedAt": "2026-07-26T09:12:44Z"},{"type": "comment","isChild": true,"parentShortcode": "DOEMHa6iPoz","parentMediaId": "3452981176004521234","commentId": "18021144556","authorUsername": "fan_account_92","authorIsVerified": false,"text": "Incredible goal!","createdAt": "2026-06-12T14:11:09Z","childCommentCount": 2,"commentLikeCount": 340,"scrapedAt": "2026-07-26T09:12:44Z"}]
How does it work?
Instagram Reel Virality Intelligence Scraper decodes the reel's media id from its shortcode and requests the reel's media-info endpoint over an Apify RESIDENTIAL proxy, using a mobile Instagram-app device identity so the request is accepted the way the real app's would be; if that path doesn't return data, it falls back to parsing the server-rendered reel page HTML. Every request is retried on a fresh residential IP if it's blocked or challenged. Only publicly visible reel data is read β nothing behind a login wall, unless you supply your own sessionId. The output schema (the field names and structure documented above) stays the same run to run regardless of changes to Instagram's page layout, because the Actor parses the underlying data payload rather than scraping visible page text.
Integrations
Calling Instagram Reel Virality Intelligence Scraper programmatically
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("scraper-engine/instagram-reel-virality-scraper").call(run_input={"urls": ["https://www.instagram.com/cristiano/reel/DOEMHa6iPoz/"],"includeComments": True,"maxComments": 50,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["shortcode"], item["engagementRate"], item["viralFlag"])
Works in Go, Ruby, Node.js, cURL β any language that can make an HTTP request.
No-code tools (n8n, Make, LangChain)
In n8n, use the official Apify node (or an HTTP Request node against the Actor's run-sync-get-dataset-items endpoint) to trigger a run and pull the resulting rows into your workflow. In Make, use the Apify app's "Run Actor" module and map urls from an upstream module. In LangChain or LlamaIndex, wrap the Actor with ApifyWrapper/ApifyActorsTool so an agent can call it as a tool and receive the reel rows as retrievable documents.
Is it legal to scrape Instagram reels?
Scraping publicly available data β the reel metadata, engagement counts, and captions any logged-out visitor can see β is generally permitted. Instagram Reel Virality Intelligence Scraper returns only publicly available data; it does not bypass login walls, and the optional sessionId input authenticates as your own logged-in session rather than defeating an access control. Because the output includes personal identifiers β ownerUsername, authorUsername, and other usernames tied to individual Instagram accounts β data-protection regimes like GDPR and CCPA can apply to how you store and use it, depending on your jurisdiction and use case. Consult legal counsel if your use case involves bulk storage of personal data.
β Frequently asked questions
What Instagram reel fields does Instagram Reel Virality Intelligence Scraper return?
The top fields are engagementRate, viralFlag, likeCount, commentCount, and originalAudioTitle β see the full field tables above for every key the Actor writes.
Does Instagram Reel Virality Intelligence Scraper require an Instagram account or login?
No. Public reel pages are fetched without any Instagram account. The optional sessionId input (or IG_SESSIONID env var) is only used as a fallback if Instagram serves a login/challenge wall to the request.
How many reels can I extract in one run?
As many as you list in urls β it's an array input, so one run can process a batch of reel URLs, shortcodes, or username/shortcode pairs in sequence. Use maxItems to cap the number actually scraped; 0 (the default) means no cap.
What happens if a reel is deleted, private, or Instagram blocks every attempt?
The Actor retries on fresh residential IPs (up to 12 attempts) before giving up on that URL; if no data comes back, it logs a warning and moves on to the next item without failing the run. If a reel returns only partial data (missing shortcode or ownerUsername), the row is still pushed to the dataset with success: false, but it is not charged β filter on success == true if you only want billed, complete rows.
Can I scrape multiple Instagram reels at once?
Yes β urls accepts a list, so one run can process many reels; maxItems limits how many of them get scraped.
Does Instagram Reel Virality Intelligence Scraper work with Claude, ChatGPT, and other AI agent tools?
It has no dedicated MCP server; it is callable as a standard Apify Actor via apify_client or a plain HTTP request, which any agent framework (LangChain, custom tool-calling agents, etc.) can invoke as a tool.
How does Instagram Reel Virality Intelligence Scraper compare to other Instagram reel scrapers?
As observed on the Apify Store on 2026-07-26, apify/instagram-reel-scraper's own listing documents a downloadedVideo field and a large existing user base, but its README does not document derived virality metrics like an engagement-rate benchmark or a viral flag. hpix/ig-reels-scraper documents profile, reel and post scraping in one Actor with a raw_data passthrough field, but its Reel output sample does not include an engagement-rate calculation, a comment-pagination method, or no-watermark media archival to durable storage. husseinbuilds/instagram-content-intelligence-pro documents Whisper-based audio transcription, which this Actor's README does not claim to offer; it does not document engagement-rate math, a viral-flag benchmark, or audio-trend fields like isTrendingInClips. Instagram Reel Virality Intelligence Scraper's distinguishing feature, per its own source code, is computing engagement rate, a viral flag against a published benchmark, and hour-by-hour velocity metrics directly from real counts, alongside the no-watermark media archive and dynamic (never-hardcoded) GraphQL comment pagination.
Does Instagram Reel Virality Intelligence Scraper return data in a format LLMs can use directly?
Yes. Output is typed, normalized JSON with consistent field names across runs β no HTML parsing or CSS selectors needed. Pass it directly to an LLM, index it into a vector store, or feed it to an agent tool.
What happens when Instagram changes its layout or anti-bot system?
The Actor is maintained and its output schema is designed to stay stable across Instagram UI and anti-bot changes, since it reads Instagram's underlying data payloads rather than scraping visible page markup. No specific turnaround time is promised.
Can I use Instagram Reel Virality Intelligence Scraper without managing proxies or browser infrastructure?
Yes. Apify RESIDENTIAL proxy routing, IP rotation on failed attempts, and mobile-identity request headers are all handled by the Actor β you don't configure a headless browser or a proxy pool yourself.
Which fields work best for AI training data and RAG indexing?
For RAG, index caption, hashtags, and comment text β the highest-information text fields. For training data or feature engineering, engagementRate, likeCount, commentCount, likesPerHour, postAgeDays, and viralFlag are typed primitives with consistent structure across every reel row.
π Related scrapers
| Scraper Name | What it extracts |
|---|---|
| Instagram Tagged Posts Scraper Plus | Posts an Instagram account is tagged in, with timestamps, tagged users, and engagement |
| Instagram Followers β© Following β Mutuals & Fans | An account's followers and following lists, with mutuals/fans breakdowns |
| Instagram B2B Lead & Contact Scraper | Instagram profile bios turned into structured lead and contact data |
π¬ Your feedback
Found a bug or a field that doesn't match what's documented here? Open an issue from the Issues tab on this Actor's Apify Store page and we'll take a look.