Instagram Single Reels Scraper
Pricing
$19.99/month + usage
Instagram Single Reels Scraper
Instagram Single Reels Scraper extracts data from any public Instagram Reel, including captions, audio, hashtags, media URLs, views, likes, comments, and timestamps. Ideal for trend analysis, influencer research, content insights, and automating structured Reel data collection at scale.
Pricing
$19.99/month + usage
Rating
5.0
(5)
Developer
SimpleAPI
Maintained by CommunityActor stats
1
Bookmarked
100
Total users
4
Monthly active users
4 days ago
Last modified
Categories
Share
Instagram Reel Scraper — Captions, Engagement Counts and Video URLs
Instagram Single Reels Scraper pulls one Instagram Reel's data from its public URL — no login, no session cookie, no Instagram account. Give it a reel link, a username/shortcode pair, or a bare shortcode and get back captionText, likeCount, commentCount, playCount, videoUrlBest, thumbnailUrl, musicArtistUsername, and a comment sample, flattened into typed dataset columns. Content researchers, brand monitoring teams, and agencies use it to verify one reel at a time instead of crawling a whole profile. Every run reports success or failure per URL, so nothing goes missing silently.
What is Instagram Single Reels Scraper?
Instagram Single Reels Scraper is a single-URL extraction tool: point it at one or more specific Instagram Reel links and it returns that reel's caption, engagement counts, video and thumbnail assets, music metadata, and a small comment sample as clean JSON rows — not a bulk profile or hashtag crawl. It runs fully logged out; no Instagram account, session cookie, or API key is required to use it.
- Looks up content by exact reference — full reel URL,
username/shortcode, or a bare shortcode — one row per input, not a bulk crawl - Returns identity and caption fields:
shortcode,mediaId,captionText, plus raw and ISO posting timestamps - Reports Instagram's own engagement counters:
likeCount,commentCount,playCount - Extracts the highest-resolution
videoUrlBestandthumbnailUrl, plus music metadata (musicAudioType,musicArtistUsername) - Samples the reel's own first-page comments (
commentsExtracted) with author, text, and verification flag - Every blocked or failed URL still writes a typed, uncharged
errorReasonrow instead of vanishing silently; results export via Apify's standard JSON/CSV/Excel formats or the API
What data can I extract with Instagram Single Reels Scraper?
Every processed URL is pushed as one row with the fields below — this is every key the Actor writes, not just the dataset's default view.
| Field | Example Value | Use Case |
|---|---|---|
url | "https://www.instagram.com/cristiano/reel/DOEMHa6iPoz/" | Identify which reel this row came from |
success | true | Separate successfully scraped rows from failed accounting rows |
errorReason | null | Typed failure reason (login_required, media_not_found, graphql_error, etc.) on failed rows |
shortcode | "DOEMHa6iPoz" | Instagram's own reel identifier, for cross-referencing |
mediaId | "3712145279353944627" | Stable internal Instagram media ID for de-duplication |
mediaType | 2 | Instagram's raw media-type flag (2 = video/reel) |
productType | "clips" | Confirms the item is a Reel rather than a feed post |
captionText | "I came here to do what I love, but I #StayedForMore..." | Caption text for keyword/hashtag/sentiment analysis |
captionCreatedAt | 1756742460 | Unix timestamp the caption was created |
takenAt | 1756742460 | Unix timestamp the reel was posted |
takenAtIso | "2025-09-01T15:01:00Z" | Human-readable posting date for reporting |
likeCount | 1806539 | Like total for engagement benchmarking |
commentCount | 20505 | Instagram-reported total comment count |
playCount | null | Play/view total when Instagram exposes it (else null, never a faked 0) |
videoUrlBest | "https://instagram.fxyz1-1.fna.fbcdn.net/o1/v/t2/f2/m86/....mp4" | Highest-resolution video asset for playback or re-use |
videoWidth | 720 | Width of the selected best-resolution video |
videoHeight | 1280 | Height of the selected best-resolution video |
thumbnailUrl | "https://instagram.fxyz1-1.fna.fbcdn.net/v/t51.71878-15/....jpg" | Highest-resolution cover image |
hasAudio | true | Filter for reels that carry audio |
musicAudioType | "original_sounds" | Distinguish original audio from a licensed track |
musicIsOriginalAudio | true | Boolean flag for original-audio reels |
musicAssetId | null | ID of the specific audio track, when Instagram supplies one |
musicArtistUsername | "cristiano" | Username of the original-audio creator, for trend/audio tracking |
location | null | Location object Instagram attaches to the reel, when present |
accessibilityCaption | null | Instagram's own auto-alt-text, when present |
commentsExtracted | [{ "commentId": "...", "commentText": "Not everyone sorry 😣", "commentUserUsername": "nouralaswad94", ... }] | First-page comment sample for lightweight sentiment spot-checks |
commentsExtractedCount | 2 | Size of the comment sample actually returned |
commentCollected | true | Whether any comments were retrieved at all |
mediaCollected | true | Whether reel media data was found (false on a failed row) |
attempts | 1 | Number of fetch attempts made, including retries |
proxy_used | "residential" | Proxy type used on the attempt that succeeded |
scraped_at | "2026-07-23T11:24:30Z" | Timestamp of extraction, for freshness checks |
Each commentsExtracted[] item carries commentId, commentText, commentUserUsername, commentUserId, commentUserVerified, commentLikeCount, childCommentCount, and commentCreatedAt.
Engagement metrics
likeCount, commentCount, and playCount are read directly from the same logged-out payload the reel's own page serves, giving a snapshot of performance at request time rather than a cached or estimated figure. playCount is genuinely null on some reels — Instagram doesn't always expose a play/view counter on this response, and the Actor never substitutes a fake 0 to make the row look complete. A common workflow: scrape a short list of reel URLs on a recurring schedule and compare likeCount/commentCount run-over-run to see whether a specific piece of content is still gaining traction or has plateaued, without needing an Instagram account to check manually.
Reel identification fields
Because this Actor works from an exact reel reference rather than a search, url, shortcode, and mediaId are what let you track and de-duplicate a specific reel across repeated runs — feed the same shortcode back in later and match it against the earlier row to build a time series for that one piece of content. There is no category, hashtag, or location filter here; the reel you get back is entirely determined by which URL, username/shortcode pair, or bare shortcode you pass in.
How does Instagram Single Reels Scraper differ from the official Instagram API?
Instagram's own Graph API only ever returns data for the Business or Creator account that authorized your app — per Meta's Instagram Platform documentation, there is no endpoint for looking up an arbitrary public reel by URL, which is the Graph API's hardest limit for anyone who needs data on content they don't own.
| Feature | Instagram Graph API | Instagram Single Reels Scraper |
|---|---|---|
| Account required | Business or Creator account linked to a Facebook Page, plus a reviewed Meta developer app | None — just an Apify account to run the Actor |
| Content scope | Only media owned by the authenticated account | Any public reel, by URL, from any account |
| Access setup | App creation, Meta app review, OAuth token generation and refresh | Paste a URL and run |
| Comment access | A separate edge, scoped to the authenticated account's own media | First-page comment sample returned inline with the reel data |
| Output shape | Nested objects following the Graph API's own object schema | Flat, typed dataset columns, one row per reel |
| Login state | Requires a persistent access token tied to a logged-in account | Fully logged out — no session, cookie, or token |
Why can't the Graph API just fetch a competitor's or client's reel?
Graph API access is scoped to whichever Business/Creator account authorized your app, and its permissions (instagram_basic, instagram_manage_insights) only unlock media that account itself owns — there is no "look up any public reel by URL" endpoint, because Meta built the permission model around a brand managing its own account's content and insights, not third-party content discovery. In practice that means a Graph API integration can pull your own reel's data all day but cannot answer "what does this competitor's or client's reel say and how is it performing" — the exact question this Actor answers, since it reads the same data the reel's public page itself serves, independent of any account's token or ownership.
The Graph API is the right tool when you own the account and want its insights inside Meta's own ecosystem. Instagram Single Reels Scraper is the right tool when you need data on a specific reel you don't control — a competitor's, a client's, or one flagged for review — without an app review process or an owned account.
How to use data extracted from Instagram?
Content researchers
Paste a list of reel URLs gathered from a research set — competitor content, a campaign's reels, or links flagged for review — into urls and run. Each row's captionText, likeCount, commentCount, playCount, and musicArtistUsername land directly in a dataset you can export to a spreadsheet, letting you compare caption angles, audio choices, and performance across a curated set of reels without opening Instagram once per link. Because commentsExtracted ships inline, a quick read of the top visible comments is available in the same row, useful for a first-pass read on audience reaction before deciding whether a reel warrants deeper analysis.
Brand monitoring agencies
Agencies tracking a fixed list of client or competitor reel URLs on a recurring basis can schedule this Actor per client, feeding the same urls list into each run. Comparing likeCount and commentCount across runs shows whether a specific reel is still gaining traction, while a row's success/errorReason flags a reel that's been deleted, made private, or is otherwise blocked — a real signal worth flagging to the client — without the agency re-checking each link by hand.
Market and trend research
Sampling reel URLs tied to a specific musicAudioType or musicArtistUsername across many creators shows how far a particular sound has spread, and cross-referencing likeCount/playCount against takenAtIso surfaces whether early adopters of a trend outperformed later ones. Because each row is a single verified reel rather than an aggregate, this is best used to build a manual sample set of URLs first (from a hashtag or creator list) and then run them through this Actor for the underlying numbers.
AI agents and automated pipelines
Because input and output are plain JSON, an agent can pass a reel URL extracted from a message, ticket, or feed item as urls and get back structured fields — captionText, engagement counts, commentsExtracted — to ground a moderation check, a summarization step, or a RAG pipeline, without the agent needing its own Instagram-fetching or proxy logic.
🔼 Input sample
Both parameters are optional — the Actor runs with the prefilled example URLs if you provide nothing else, though urls needs at least one real entry to produce any output.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
urls | No | array | List of Instagram reel inputs to scrape. Accepts a full URL (https://www.instagram.com/cristiano/reel/DOEMHa6iPoz/), a username/shortcode pair (cristiano/DOEMHa6iPoz), or a bare shortcode. | ["https://www.instagram.com/cristiano/reel/DOEMHa6iPoz/", "cristiano/DOEMHa6iPoz"] |
proxyConfiguration | No | object | Proxy settings. This Actor always uses RESIDENTIAL Apify Proxy for every request regardless of the group selected here — only the apifyProxyCountry (if set) is honored. | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US"} |
{"urls": ["https://www.instagram.com/cristiano/reel/DOEMHa6iPoz/","cristiano/DOEMHa6iPoz"],"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountry": "US"}}
Common pitfall: starting a run with urls left empty produces zero dataset rows — not even an error accounting row, since that check happens before any per-URL processing. Always confirm urls has at least one entry before starting a run. Separately, whichever apifyProxyGroups value you pick in proxyConfiguration is ignored — the Actor always issues requests over a residential proxy for reliability; only the country is actually honored.
🔽 Output sample
Output is typed, normalized JSON with a consistent schema across every row, exportable as JSON, CSV, or Excel from the dataset, or fetched via the Apify API.
{"url": "https://www.instagram.com/cristiano/reel/DOEMHa6iPoz/","scraped_at": "2026-07-23T11:24:30Z","proxy_used": "residential","attempts": 1,"mediaCollected": true,"errorReason": null,"shortcode": "DOEMHa6iPoz","mediaId": "3712145279353944627","mediaType": 2,"productType": "clips","captionText": "I came here to do what I love, but I #StayedForMore. The people, the energy, and...","captionCreatedAt": 1756742460,"takenAt": 1756742460,"takenAtIso": "2025-09-01T15:01:00Z","likeCount": 1806539,"commentCount": 20505,"playCount": null,"videoUrlBest": "https://instagram.ftun10-1.fna.fbcdn.net/o1/v/t2/f2/m86/AQN4j-akK4-Os0...mp4","videoWidth": 720,"videoHeight": 1280,"thumbnailUrl": "https://instagram.ftun10-1.fna.fbcdn.net/v/t51.71878-15/539543640_1700...jpg","hasAudio": true,"musicAudioType": "original_sounds","musicIsOriginalAudio": true,"musicAssetId": null,"musicArtistUsername": "cristiano","location": null,"accessibilityCaption": null,"commentsExtracted": [{"commentId": "17899517133514496","commentText": "Not everyone sorry 😣","commentUserUsername": "nouralaswad94","commentUserId": "399797756","commentUserVerified": false,"commentLikeCount": null,"childCommentCount": null,"commentCreatedAt": null}],"commentsExtractedCount": 1,"commentCollected": true,"success": true}
A blocked or failed URL still produces a row instead of silence:
{"url": "https://www.instagram.com/someone/reel/abc12345/","scraped_at": "2026-07-11T00:00:00Z","proxy_used": "none","attempts": 3,"mediaCollected": false,"errorReason": "login_required","commentCollected": false,"commentsExtracted": [],"commentsExtractedCount": 0,"success": false}
This uncharged accounting row is never billed — only successfully scraped reels (the row_result event) are. Filter it out downstream with success == true or errorReason == null.
How do you filter and target specific Reels?
With only urls and proxyConfiguration as inputs, there is no category, keyword, or location filter to tune here — the single targeting mechanism is which exact reels you list in urls. Precision comes from what you put into that array: a full URL or username/shortcode pair pins down one exact reel with no ambiguity, while batching several references in a single run scopes that run to exactly the set of reels you care about (a client's latest posts, a competitor watchlist, a queue of links flagged for review) without pulling in anything else. There's no volume cap in the schema beyond the length of urls itself, so scoping a run is really just curating that list — and checking success/errorReason on the way out tells you which of those specific reels actually came back.
▶️ Want to try other Instagram scrapers?
| Scraper Name | What it extracts |
|---|---|
| Instagram Reels Scraper With Engagement Analytics | Bulk Reels per creator with co-author/tagged-user/paid-partnership detection and derived engagement-rate, velocity, and views-per-follower analytics |
| Instagram Comments Scraper (Spam & Toxic Comment Detection) | Comments and replies from a post/reel with rule-based toxicity, spam, scam, and bot-pattern flags |
| Instagram Profile Scraper + Account Privacy Checker | Bulk account status (active/private/not found), account-type classification, and full profile data |
| Instagram Hashtag Scraper: Content Planner | Posts/reels for a hashtag turned into a best-time-to-post histogram and recurring caption keywords |
| Instagram Followers Count Scraper | Follower/following/post counts plus full public profile data for any username |
| Instagram Tagged Posts Scraper: Videos, Carousels & Reels Info | Posts where a target profile is tagged, with normalized video, carousel-slide, and Reels music data |
How to extract Instagram data programmatically
This Actor runs as a standard Apify Actor: one API call starts the run, structured JSON comes back from the dataset — no separate scraping infrastructure to maintain.
Python example
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("SimpleAPI/instagram-single-reels-scraper").call(run_input={"urls": ["https://www.instagram.com/cristiano/reel/DOEMHa6iPoz/"],})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["captionText"], item["likeCount"], item["videoUrlBest"])
Export to spreadsheets or CRM
Export the dataset directly as CSV from the Apify Console or via the API, then import into a spreadsheet or tracking sheet. Map url to a source-link column, captionText to a content/notes column, and likeCount/commentCount/playCount to numeric engagement columns so every imported row still traces back to the original reel.
Is it legal to scrape Instagram Reels?
Yes — this Actor collects only what is publicly visible on a reel's own page, without logging in or accessing anything behind an authentication wall, and public reels exist to be seen and shared. That said, scraped rows can contain personal data: a commenter's commentUserUsername, and a musicArtistUsername identifying an original-audio creator. Where that applies, GDPR and CCPA govern how you may store and use it — you need a lawful basis for holding personal data and must honor deletion/access requests from the people it describes. Consult legal counsel for commercial applications involving bulk storage of personal data.
❓ FAQ
What happens if a reel is deleted or made private after I scrape it?
The dataset holds a snapshot from scraped_at — it doesn't update itself. Re-run the same URL later if you need to check current status; a reel that's since been removed, made private, or otherwise blocked comes back with success: false and a typed errorReason (e.g. media_not_found, login_required) instead of stale data pretending to be current.
Can I get comments along with the main reel data?
Yes, automatically — every row includes commentsExtracted, a first-page sample of the reel's own visible comments (author, text, verification flag), with commentsExtractedCount telling you how many were found. This comes from the same response as the reel data itself, so there's no separate comment-fetch step or extra input to enable — but it is a small, first-page sample, not the full comment thread.
How accurate is the engagement data?
The Actor returns likeCount, commentCount, and playCount exactly as Instagram's own logged-out response reports them at request time. Counts change continuously on Instagram itself, so treat each row as a snapshot and re-scrape the same URL if you need current numbers.
How many reels can I get per run?
There's no hard cap in the input schema — every entry in urls is processed in the same run. Each URL gets up to 3 fetch attempts on a freshly rotated residential proxy if a request fails or comes back blocked, with a short pause between items, so a large urls list simply takes proportionally longer rather than being truncated.
How do I control exactly which reel I get back?
There's no keyword or category search here — the reel you get is whichever one you reference in urls, as a full URL, a username/shortcode pair, or a bare shortcode. This makes the Actor precise for known-reel lookups but not a discovery tool; pair it with a separate hashtag or profile scraper if you need to find reel URLs first.
Does Instagram Single Reels Scraper work with Claude, ChatGPT, and AI agent frameworks?
Yes — it's callable as a standard HTTP endpoint via the Apify API by any agent framework that can make an authenticated REST call. Pass a reel URL as urls and read structured fields (captionText, engagement counts, commentsExtracted) back from the dataset.
How does Instagram Single Reels Scraper compare to other Instagram scrapers?
It's deliberately narrower than a bulk Reels crawler: it takes exact reel URLs rather than a creator or hashtag to crawl, and it does not extract owner/creator identity, co-author or tagged-user graphs, paid-partnership flags, or derived engagement-rate analytics — those are covered by this account's own Instagram Reels Scraper With Engagement Analytics, built on the same fetch technique. Choose this Actor when you already have the specific reel links you need; choose the analytics variant when you need to crawl a creator's Reels in bulk with collaboration and ratio data attached.
Can I use this without an Instagram API key or developer account?
Yes — no Instagram login, session cookie, API key, or Meta developer account is required. The only credential needed is your own Apify account to run the Actor.
Do I need to configure my own proxies for this to work reliably?
No — the Actor always requests over a residential Apify Proxy regardless of what you set in proxyConfiguration; only the apifyProxyCountry value, if provided, is honored. This is a deliberate reliability choice, since datacenter IPs get blocked quickly on Instagram's logged-out surfaces.
Conclusion
Instagram Single Reels Scraper turns a specific reel URL into a structured, typed dataset row — caption, engagement counts, video and thumbnail assets, music metadata, and a comment sample — without an Instagram login or a Meta developer account. It's built for researchers, brand monitoring agencies, and anyone who needs honest per-URL accounting on a known list of reels rather than a bulk profile crawl. Start a run in Apify Console with your reel URLs in urls to see rows populate the dataset as each one is scraped.