Instagram Profile Reels Scraper
Pricing
$14.99/month + usage
Instagram Profile Reels Scraper
Extract public Instagram Reels data quickly with the Instagram Profile Reels Scraper. This Apify actor collects reel captions, view counts, likes, comments, hashtags, and posting dates from any public profile—ideal for analytics, marketing insights, or influencer research.
Pricing
$14.99/month + usage
Rating
0.0
(0)
Developer
Scraper Engine
Maintained by CommunityActor stats
2
Bookmarked
23
Total users
2
Monthly active users
3 days ago
Last modified
Categories
Share
Instagram Profile Reels Scraper — Captions, Likes and Comments
Instagram Profile Reels Scraper reads a public Instagram profile's Reels tab and returns one structured JSON row per reel: the reel URL, caption, UTC timestamp, the real owner's username and full name, like and comment counts, one sampled comment, and a thumbnail image URL — no HTML parsing, no headless browser output to clean up. It runs on Apify with no Instagram login, cookie, or API key required. Give it a username, an @handle, or a profile URL and start the run from the Apify Console.
What is Instagram Profile Reels Scraper?
Instagram Profile Reels Scraper is an Apify Actor that scrapes the Reels tab of any public Instagram profile and returns one normalized dataset row per reel. It authenticates as nobody: src/main.py never reads or stores a username, password, cookie, or session id, and the input schema has no field for one. It's built for social media analysts, influencer marketing teams, and AI engineers who need reel-level engagement data as a structured feed rather than a manual export.
What Instagram reel data is publicly available to scrape?
Anyone who opens a public Instagram profile's Reels tab in a logged-out browser can already see every reel this Actor returns: the thumbnail, the caption, the engagement counts, and the account that actually posted it.
| Data category | Publicly available | Restricted (needs Instagram login) |
|---|---|---|
| Reel thumbnail, caption, UTC timestamp | Yes | — |
| Like count | Yes, unless the creator has disabled it | Hidden counts stay hidden regardless of login |
| Comment count | Yes | — |
| One sampled top comment | Yes, read off the reel's own page | Full comment thread and replies |
| The reel's real owner (collaborations, reshares, cross-posts) | Yes, read off the media item | — |
| Reels on a private account | No | Entirely login-walled — reported as a failure, never an empty result |
Instagram Profile Reels Scraper only returns publicly visible data — what any visitor sees. Nothing behind a login wall.
What data can I extract with Instagram Profile Reels Scraper?
Every run returns reel identity and creator fields plus engagement fields — nine keys total, written by build_row() in src/main.py.
| Field | Description |
|---|---|
url | Canonical reel link: https://www.instagram.com/reel/<shortcode>/ for a genuine reel, /p/<shortcode>/ for the rare non-reel item Instagram still lists in the Reels tab |
timestamp | ISO-8601, timezone-aware UTC posting time, e.g. 2026-07-24T19:05:57.000Z |
ownerUsername | The account that actually posted the reel, read off the media item — not necessarily the profile you queried |
ownerFullName | The owner's display name, exactly as Instagram serves it, punctuation and emoji intact |
caption | Full caption text, or null when the reel has none |
displayUrl | Thumbnail image URL — a still frame, not the video file |
likesCount | Like count, or null when extractEngagement is off or the creator has hidden like counts |
commentsCount | Comment count, or null when extractEngagement is off |
firstComment | Text of one comment sampled from the reel's own page, or null when extractComments is off, the reel has no comments, or the page didn't serve a comment block |
Reel identity and creator fields
url, timestamp, ownerUsername, ownerFullName, caption, displayUrl — what the reel is, who actually posted it, and when.
Engagement fields
likesCount, commentsCount, firstComment — the numbers and the one comment sampled from the reel page.
🤖 Add-on: Need additional Instagram data?
If you need the full profile grid — photos and carousels alongside reels, not just reels — Instagram Post Scraper Pay Per Events covers all three post types from the same profile or from a single post URL. For a deep single-reel breakdown instead of a profile-wide scan — virality scoring, audio-trend context, a no-watermark video download, deep comment pagination — Instagram Reel Virality Intelligence Scraper is the narrower fit. Posts a profile is tagged in, rather than posts it authored, are covered separately by Instagram Tagged Posts Scraper Plus.
Why not build this yourself?
Instagram ships no public API for reading an arbitrary public profile's Reels tab — the official Graph API is scoped to Business or Creator accounts an app has been granted access to through Meta's own review process, not to any public profile a caller names. Building this yourself means solving problems this Actor's own source already documents fixing: the Reels tab isn't reachable with a plain GET — it's a keyless but header-gated POST /api/v1/clips/user/ that answers 403 "CSRF token missing or incorrect" unless you first harvest a fresh X-CSRFToken and numeric user id off the profile page, both of which move whenever Instagram edits its page bundle; a rotating exit IP mid-profile invalidates that token pair, so a proxy session pinned per profile is required, not optional; and a creator who has hidden their like count is still served a placeholder number by Instagram — publishing it instead of nulling it fabricates a metric that looks real. An earlier version of this Actor family read the generic profile feed instead of the Reels tab specifically, and its own source notes that only 45.9% of the rows it charged for were actually reels, pooled over six creators — as low as 21% on two of them. Running a maintained Actor keeps fixes like these centralized instead of quietly breaking your own pipeline the next time Instagram changes something upstream.
How to use Instagram Profile Reels Scraper
Instagram Profile Reels Scraper runs entirely inside Apify — there's no separate sign-up or API key to obtain before your first run.
- Open Instagram Profile Reels Scraper on the Apify Console or the Apify Store listing.
- Fill in
urlswith one or more usernames,@handles, or profile URLs — this is the only required input. - Optionally adjust
resultsLimit,extractComments,extractEngagement, andproxyConfigurationto shape what comes back and how much it costs. - Click Start and let the run finish.
- Open the Storage tab to view the dataset, or export it as JSON, CSV, Excel, XML or HTML.
How to scale to bulk reel extraction
urls is an array (editor: stringList), so one run already accepts any mix of usernames, @handles, and profile URLs — there's no separate bulk mode to switch on. Each entry is normalized to a canonical lowercase username before scraping starts, and duplicates that resolve to the same account are collapsed automatically, so mixing natgeo, @natgeo, and https://www.instagram.com/natgeo/ in the same list costs nothing extra. Profiles are scraped one at a time within the run, each on its own pinned proxy session.
What can you do with Instagram reel data?
- 📊 A social media analyst tracking a competitor's Reels performance uses
likesCountandcommentsCountacross a profile's recent reels to chart engagement trends over time. - 🕵️ An influencer marketing manager vetting a creator uses
ownerUsernameandownerFullNameto confirm which reels the account actually posted itself, versus which were collaborations or reshares from someone else. - 📅 A content strategist building a posting calendar uses
timestampacross a profile's reels to chart posting cadence and time-of-day patterns. - 💬 A social listening team uses
firstCommentas an early read on audience reaction to a newly posted reel, without pulling a full comment thread. - 🤖 An AI engineer feeds
captionandfirstCommentinto a RAG pipeline or an LLM-based sentiment tool — every field is a typed JSON primitive, so no HTML parsing step is needed first.
Because the Actor runs as a standard Apify Actor reachable through the Apify API, any of the above can be wired into an agent that pulls fresh reel data on a schedule rather than run by hand.
How does Instagram Profile Reels Scraper handle rate limits and blocking?
Every request goes through Apify Proxy. One proxy session is pinned per profile (new_sticky_session), so a single profile's scrape never rotates exit IPs mid-run — a rotating exit would invalidate Instagram's CSRF and session cookie pair. When your configured proxy tier is blocked — a profile-page HTTP 401/403/429, a non-JSON response from the reels endpoint, or an unreadable numeric user id — before any row has been charged, the Actor automatically retries once on the Apify RESIDENTIAL proxy group, unless you already named RESIDENTIAL yourself, in which case nothing is overridden. Transport-level failures (timeouts, connection errors) are retried up to three times with an increasing pause between attempts. A reels response with zero items on page 1 is treated as a block, not a silent empty success, because Instagram answers a blocked exit, a private account, and a genuinely empty profile with the identical HTTP 200 and an empty list. A profile that ultimately fails does not fail the whole run, provided at least one queried profile returned rows; the run only fails outright if every profile failed.
⬇️ Input
This Actor is billed pay-per-event on a single event, row_result ($0.002 per event, per .actor/pay_per_event.json). There is exactly one call to Actor.push_data anywhere in src/main.py — inside scrape_profile_on_tier — and it always carries charged_event_name="row_result", so every dataset row was charged, and there is no separate uncharged accounting or diagnostic row type pushed alongside it. A profile that fails to resolve, gets blocked, or turns out to be private never reaches that call, so nothing is charged for it.
| Parameter | Required | Type | Description | Example value |
|---|---|---|---|---|
urls | Yes | array of strings | Public Instagram profiles to scrape. Accepts a bare username (natgeo), an @handle (@mrbeast), or a full profile URL (https://www.instagram.com/cristiano/). Private accounts are not readable without a login and are reported as failures, never as empty results. | ["natgeo", "https://www.instagram.com/cristiano/", "@mrbeast"] |
resultsLimit | No | integer (default 10, minimum 0, maximum 10000) | How many rows to return for each profile. Honoured literally — 1 returns exactly one row. Instagram's own paging caps any profile at 2400 reels (200 pages of 12), so higher values simply stop there. 0 means unlimited, bounded at 2000 reels per profile, and can run for hours. | 25 |
extractComments | No | boolean (default true) | Fetch each reel's own page and read the top comment into firstComment. Costs roughly one extra page request per row. Off ⇒ firstComment is null, never an empty string. | true |
extractEngagement | No | boolean (default true) | Fill likesCount and commentsCount from the reel payload already downloaded, at no extra request cost. Off ⇒ both are null — never 0, which would be indistinguishable from a genuinely zero-engagement reel. | true |
proxyConfiguration | No | object (default {"useApifyProxy": true}) | Your proxy choice is used exactly as configured — groups, country, and custom proxyUrls are all honoured, and the proxy can be turned off entirely. Instagram rate-limits Apify's shared datacenter pool, so the RESIDENTIAL group is used as a one-step rescue if the configured exit is blocked before any row is charged. | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} |
Example input
{"urls": ["natgeo", "https://www.instagram.com/cristiano/", "@zachking"],"resultsLimit": 25,"extractComments": true,"extractEngagement": true,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
⬆️ Output
Results are written to the Actor's dataset as typed, normalized JSON — one row per reel, nine fields, with a consistent field set across runs. Export the dataset as JSON, CSV, Excel, XML, or HTML from the Storage tab, or fetch it through the Apify API.
Example output
{"displayUrl": "https://scontent.cdninstagram.com/v/t51.../DbL8z9yApVu.jpg","caption": "While removing abandoned fishing nets from a submerged shipwreck, divers uncovered something nobody expected.","ownerFullName": "National Geographic","ownerUsername": "natgeo","url": "https://www.instagram.com/reel/DbL8z9yApVu/","commentsCount": 211,"firstComment": "This is amazing news!! Bring back the diversity and healthy ecosystems.","likesCount": 36320,"timestamp": "2026-07-24T19:05:57.000Z"}
How does it work?
Requests are routed through Apify Proxy, with one proxy session pinned per profile so the exit IP stays constant for the whole scrape. For each profile, the Actor first loads the public profile page to harvest Instagram's own numeric user id, APP_ID, and CSRF token, then POSTs to Instagram's own Reels-tab endpoint (/api/v1/clips/user/) with those values attached — the same surface the Instagram web app itself calls — and pages through it 12 items at a time using the cursor Instagram returns. When extractComments is on, each reel's own page is fetched a second time to read one sampled comment out of the page's embedded comments_connection payload, using a brace-balanced parser rather than a recursive key search that could return the wrong match. Only what a logged-out visitor could already see is returned; nothing is read from behind a login wall. The nine-field output schema is fixed by the Actor's own row-building code, so it stays the same run to run even when Instagram changes its page markup underneath.
Integrations
Instagram Profile Reels Scraper runs on Apify, so it works with anything that can call the Apify API or trigger an Apify Actor run.
Calling Instagram Profile Reels Scraper programmatically
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_API_TOKEN>")run = client.actor("your-account/instagram-profile-reels-scraper").call(run_input={"urls": ["natgeo", "https://www.instagram.com/cristiano/"],"resultsLimit": 25,"extractComments": True,"extractEngagement": True,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["url"], item["likesCount"], item["commentsCount"])
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 HTTP Request node (or the community Apify node) pointed at the Actor's run endpoint, passing the same JSON input shown above. In Make, the Apify app module starts a run and iterates the resulting dataset as part of a scenario, with no custom code required. In LangChain or a comparable agent framework, wrap the Apify API call as a tool so an agent can request fresh reel data mid-conversation instead of working from a stale export.
Is it legal to scrape Instagram reels?
Scraping publicly available data — the kind any logged-out visitor to Instagram can already see — is generally lawful in most jurisdictions. Instagram Profile Reels Scraper returns only what Instagram serves to a logged-out visitor: no private accounts, and no data pulled from a signed-in session — src/main.py never reads, stores, or requires an Instagram credential of any kind. Because a reel owner's username and full name identify a real person, GDPR (EU) and CCPA (California) may still govern how you store and use anything you collect that identifies someone, even though the underlying scrape is of public information. Consult legal counsel if your use case involves bulk storage of personal data.
❓ Frequently asked questions
What Instagram reel fields does Instagram Profile Reels Scraper return?
The top fields are url, timestamp, ownerUsername, likesCount, and commentsCount — see the full field table under "What data can I extract with Instagram Profile Reels Scraper?" above.
Does Instagram Profile Reels Scraper require an Instagram account or login?
No. src/main.py never authenticates against Instagram — there is no username/password, cookie, or session-id field anywhere in the input schema, and every request is made as a logged-out visitor.
How many reels can I extract in one run?
Up to resultsLimit per profile (default 10, maximum 10,000), across any number of profiles since urls accepts an array. Instagram's own paging caps every profile at 2,400 reels regardless of what you set resultsLimit to, because the server always returns 12 items per page and the Actor stops at 200 pages. Setting resultsLimit to 0 requests unlimited rows, which this Actor bounds at 2,000 reels per profile.
What happens if a profile is private or doesn't exist?
Both are reported as a failed profile with a specific reason, never as an empty success. A nonexistent username returns Instagram's HTTP 404 and is reported as "the profile does not exist"; a private account is detected from the profile page itself and reported as "the account is private — no reels are visible without a login." A run only fails outright if every queried profile fails this way — if at least one profile returned rows, the run succeeds and names the failed profiles in its status message.
Can I scrape multiple Instagram profiles at once?
Yes. urls is an array — mix usernames, @handles, and profile URLs freely in one run, and entries that resolve to the same account are collapsed automatically before scraping starts.
Does Instagram Profile Reels Scraper work with Claude, ChatGPT, and other AI agent tools?
It's callable as a standard HTTP endpoint through the Apify API, so any agent framework that can make an HTTP request — including custom tools built for Claude- or ChatGPT-based agents — can trigger a run and read back the resulting dataset.
How does Instagram Profile Reels Scraper compare to other Instagram Reels scrapers?
Checked on the Apify Store on 2026-07-30: Fast Instagram Profile Reels Scraper by instagram-scraper documents a richer per-reel field set — video_url, play_count, view_count, hashtags, tagged_user, location — against this Actor's frozen nine-field contract, and documents a postsPerProfile minimum of 5, versus this Actor's resultsLimit minimum of 0. Their README documents a restricted_profile charge event for profiles that come back empty, but does not document the event name charged for a successful row. Fast Instagram Scraper API by apidojo covers reels as one of seven query types across profiles, hashtags, locations, audio, and search, and per its own listing prices a "User Query" at $0.005 plus $0.0005 per additional post beyond 10 free — a different pricing shape from this Actor's flat $0.002 per reel row. Instagram Metrics & Profile Scraper by memo23 covers profiles, posts, reels, and comments from one input box, is priced as a flat monthly subscription rather than pay-per-event on its own listing, and documents a metricsMode output where removed or private posts return a labeled, never-billed status row — a similar "don't fabricate a number" approach to this Actor nulling out hidden like counts rather than publishing Instagram's placeholder value.
Does Instagram Profile Reels Scraper return data in a format LLMs can use directly?
Yes. Every field is typed, normalized JSON with consistent names across runs — no HTML parsing or CSS selectors required. Pass a row directly to an LLM prompt, index caption and firstComment into a vector store, or feed the whole dataset to an agent tool.
What happens when Instagram changes its layout or anti-bot system?
The Actor is maintained. Its current reels-tab endpoint and CSRF-harvesting logic replaced an earlier approach — documented directly in src/main.py — that read the generic profile feed instead of the Reels tab and, by its own measurement, charged for rows that were reels only 45.9% of the time. No specific turnaround time for future fixes is promised here.
Can I use Instagram Profile Reels Scraper without managing proxies or browser infrastructure?
Yes. Proxy selection and the residential fallback are handled through Apify Proxy (proxyConfiguration), and the Actor makes plain HTTP requests through curl_cffi rather than driving a real browser — you don't provision or maintain either yourself.
Which Instagram reel fields work best for AI training data and RAG indexing?
For RAG indexing, caption and firstComment carry the highest-information free text. For structured training data, url, timestamp, ownerUsername, likesCount, and commentsCount are present in every run configuration and stay consistently typed across rows, making them the most reliable fields to key on.
🔗 Related scrapers
| Scraper | What it extracts |
|---|---|
| Instagram Post Scraper Pay Per Events | Every public post, reel, and carousel from a profile grid or a single post URL |
| Instagram Reel Virality Intelligence Scraper | Deep single-reel analytics — virality scoring, audio-trend context, no-watermark video download |
| Instagram Tagged Posts Scraper Plus | Posts an account is tagged in, rather than posts it authored |
| Instagram Followers ∩ Following — Mutuals & Fans | A profile's follower and following graph, plus mutual/fan set analytics |
| Instagram B2B Lead & Contact Scraper | Publicly listed business email and phone details discovered from Instagram profiles |
| TikTok-Hashtag-Scraper | The same hashtag-driven content discovery pattern, for TikTok instead of Instagram |
💬 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 so it can be checked against a live run and fixed. Bug reports and missing-field requests are what keeps this Actor's parsing logic current as Instagram's own page markup changes.