Instagram Reels Scraper — Profiles, Hashtags & Reel URLs
Pricing
from $0.90 / 1,000 reel extracteds
Instagram Reels Scraper — Profiles, Hashtags & Reel URLs
Scrape public Instagram Reels from profiles, hashtags or Reel URLs. Each Reel has video URL, plays, likes, comments, caption, music, tags and owner details. No login needed. Works with Apify MCP and the API.
Pricing
from $0.90 / 1,000 reel extracteds
Rating
0.0
(0)
Developer
Khadin Akbar
Maintained by CommunityActor stats
1
Bookmarked
319
Total users
45
Monthly active users
a day ago
Last modified
Categories
Features
Share
What is Instagram Reels Scraper — Profiles, Hashtags & Reel URLs?
Instagram Reels Scraper extracts public Instagram Reels from creator profiles, topic hashtags or direct Reel links and returns one dataset row per Reel. Each row carries the Reel URL, author username and display name, full caption, hashtags and mentions, collab co-authors, likes, comments, views and plays, duration, audio title and artist, posting time, sponsorship flag, and direct video and thumbnail links. Social media managers, brand and agency researchers, creator-marketing teams and AI agents use it to study what a profile or topic publishes in Reels, with no Instagram login.
Why people choose this Actor
- Fast on many accounts. Up to four sources are read at the same time, so a batch of profiles finishes in seconds instead of queueing one after another. One profile at 120 Reels takes about a minute.
- A backup route behind the main one. If the main data route is unavailable or rate-limits, the Actor moves to a second and then a third route and carries on from the same profile, without duplicate rows.
- The same 24 fields on every row. Hashtag rows add one extra field,
collection_method. Fields Instagram does not provide arenull, never missing, so a spreadsheet or schema stays stable between runs. - Honest results. The run summary says whether the run is
COMPLETE,PARTIAL, empty, or ended without data, and lists every source that returned fewer Reels than you asked for, with the reason. - Platform usage is included. You pay per Reel saved plus a small start event. There is no separate compute or proxy bill.
- Collab Reels included. Reels where the profile is a co-author show on its Reels tab and are kept by default; switch
includeCollabReelsoff to keep only Reels the profile posted itself.
Best fit for this Actor
- Best fit for content and competitor research on public Reels from known accounts or topics.
- Pages through each profile's Reels tab: the default of 12 Reels per source is one page, and
maxReelsPerSourcescales up to 500 for deeper research. If a profile has fewer public Reels,RUN_SUMMARY.sourceShortfallssays so. - Use
directUrlswhen you already have Reel links and want one normalized row per link. - Hashtag sources return a sample of public Reels whose caption contains the tag, not the full Instagram hashtag feed.
- Private or missing accounts return no Reels and are not charged.
- When you want the spoken words of the Reels you picked, then pass the
reel_urlvalues to Instagram Transcript Scraper. - When follower totals matter for your shortlist, continue with Instagram Profile Scraper for each
username.
Example workflow: a sportswear brand benchmarks competitor Reels
A social media manager at a sportswear brand starts with usernames set to three competitor accounts, maxReelsPerSource at 25 and onlyReelsNewerThan at 30 days. The dataset returns each competitor's recent Reels with plays, likes, duration, mentions and is_sponsored. She exports the rows to a spreadsheet, then compares average plays per account and sorts by likes_count to find the formats that land. The mentions column shows which athletes and partners each brand features, and audio_title shows whether a format leans on original audio or licensed music. She schedules the same input weekly so the sheet keeps a rolling month of competitor Reels, then feeds the top ten reel_url values into a transcript step for script ideas.
Input
Recent Reels from two profiles:
{"usernames": ["natgeo", "https://www.instagram.com/nasa/"],"maxReelsPerSource": 10,"onlyReelsNewerThan": "30 days"}
Reels for a topic hashtag, plus one known Reel link:
{"hashtags": ["travel"],"directUrls": [{ "url": "https://www.instagram.com/reel/Ddug0K2ggYm/" }],"maxReelsPerSource": 5}
| Input | What it controls |
|---|---|
usernames | Instagram handles or profile URLs, such as natgeo or https://www.instagram.com/natgeo/ |
hashtags | Topic keywords without the #, such as travel or fitness |
directUrls | Reel links on instagram.com using /reel/ or /p/ paths, each as {"url": "..."} |
maxReelsPerSource | Reels to collect per username, hashtag or link, from 1 to 500 (default 12). Profiles are paged until this number or the end of the public feed |
includeCollabReels | Profiles only. On by default: include collab Reels where the profile is a co-author. Off keeps only Reels the profile posted itself |
onlyReelsNewerThan | Date filter: YYYY-MM-DD, an ISO timestamp with a timezone, or phrases like 30 days, 2 weeks, 3 months (each month means 30 days) |
Fill in at least one of usernames, hashtags or directUrls. Profile and Reel links are accepted in usernames, and the same Reel given twice is saved once.
Output
A real row from a NASA profile run (long text and CDN links shortened):
{"reel_id": "DfhyUf-vhkA","reel_url": "https://www.instagram.com/reel/DfhyUf-vhkA/","username": "nasa","display_name": "NASA","profile_url": "https://www.instagram.com/nasa/","follower_count": null,"caption": "The weekend ends. The mission keeps going.\n\nThis is what American ambition looks like. 🇺🇸🚀","hashtags": [],"mentions": [],"collaborators": ["nasaadmin"],"likes_count": 15395,"comments_count": 202,"views_count": 1215028,"plays_count": 1215028,"duration_seconds": 86.72,"video_url": "https://instagram.fsvq6-1.fna.fbcdn.net/o1/v/t2/f2/m86/AQN-b...","thumbnail_url": "https://instagram.fsvq6-1.fna.fbcdn.net/v/t51.82787-15/89337...","audio_title": "Original audio","audio_artist": "nasa","is_sponsored": false,"is_pinned": null,"posted_at": "2026-11-09T16:47:12.000Z","scraped_at": "2026-11-09T21:42:59.253Z","source_url": "https://www.instagram.com/nasa/reels/"}
| Field | What it contains |
|---|---|
reel_id, reel_url | Reel shortcode and its Instagram link |
username, display_name, profile_url | The account that posted the Reel |
follower_count | Account followers; often null because Reels pages leave it out. Use the profile Actor below for follower totals |
caption, hashtags, mentions | Full caption plus hashtags and mentioned accounts parsed from it |
collaborators | Collab co-authors. Profile runs include collab Reels that show on the profile's Reels tab |
likes_count, comments_count | Likes and comments at collection time |
views_count, plays_count | View and play counts at collection time |
duration_seconds | Reel length in seconds |
video_url, thumbnail_url | Direct video file and cover image links; download them soon after the run |
audio_title, audio_artist | The sound: Original audio with the creator's handle, or the licensed track and artist |
is_sponsored, is_pinned | Paid-partnership flag, and the pinned flag when the profile exposes it |
posted_at, scraped_at | Publish time and collection time (ISO 8601) |
source_url | The profile, hashtag page or Reel link that produced the row |
collection_method | Present only on hashtag rows, which are a topic sample rather than the full native feed |
If a run returns nothing, or fewer Reels than you asked for
OUTPUT and RUN_SUMMARY in the default key-value store explain every run. Read outcome first:
outcome | What it means | What to do |
|---|---|---|
COMPLETE | Every source gave the requested number of Reels or reached the end of its public feed | Nothing; use the dataset |
PARTIAL | Some Reels were saved, but a source stopped early, such as at the run timeout or the charge limit | Check RUN_SUMMARY.sourceShortfalls, then raise the timeout or charge limit, or request fewer sources per run |
VALID_EMPTY | A source was verified and has no Reels: the profile is missing, private or has none, or all its Reels are older than onlyReelsNewerThan | Check the username, or widen the date filter |
INVALID_INPUT | The input could not be used: a bad date, a Reel link that does not exist or is private, or a charge limit too low to save one Reel | Fix the input named in message and run again |
UPSTREAM_FAILED | Every data route was unavailable and nothing could be saved. No Reel is charged | Run again later |
CONFIG_ERROR | The Actor build has no data route configured | Open an issue; nothing was charged |
sourceShortfalls lists each source with saved, requested and a reason: feed_ended (the account has fewer public Reels), profile_not_found (missing or private), run_timeout, or stopped_early.
Pricing
This Actor uses Pay per event, and platform usage is included in the price. Each Reel saved to the dataset is one Reel Extracted event, and every run has a small Actor Start event. There is no separate compute or proxy bill. Paid Apify plans get volume discounts per Reel. Open the live Pricing tab on this page for current rates.
- Three profiles at the default of 12 Reels each = 36 Reel Extracted events plus one Actor Start.
- A run that finds nothing, or fails, saves no Reels and charges no Reel events.
maxReelsPerSourcecaps each source, and the run's maximum charge setting caps the whole run, so you control the ceiling.
Free Apify plan
Runs started from a free Apify plan return up to 25 results per run, with every input mode and output field available. Paid Apify plans have no per-run limit, so your usual result settings apply.
API example
curl -X POST "https://api.apify.com/v2/acts/khadinakbar~instagram-reels-scraper/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"usernames": ["nike"], "maxReelsPerSource": 10, "onlyReelsNewerThan": "2 weeks"}'
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("khadinakbar/instagram-reels-scraper").call(run_input={"usernames": ["natgeo"], "maxReelsPerSource": 5})for reel in client.dataset(run["defaultDatasetId"]).iterate_items():print(reel["reel_url"], reel["plays_count"], reel["likes_count"])
Use Instagram Reels Scraper with AI agents (MCP)
Connect this Actor to Claude, ChatGPT, Cursor or any MCP client through Apify MCP, then ask in plain language:
Get the last 10 Reels from @nasa and @natgeo posted in the past month, then rank them by plays and tell me which topics and partner mentions perform strongest.
What the agent does and gets back:
- Calls
khadinakbar/instagram-reels-scraperwithusernames,maxReelsPerSource: 10andonlyReelsNewerThan: "30 days". - Reads the rows with
get-dataset-items; each row is one Reel with caption, hashtags, mentions and engagement counts. - Sorts by
plays_countand groups byhashtagsandmentionsbefore answering. - Checks
OUTPUTfor the runoutcomeanditemsPushed, and treats hashtag rows as a topic sample. Cost scales with Reels returned, so it keepsmaxReelsPerSourceclose to the request.
Facts an agent can plan with:
| Question | Answer |
|---|---|
| Login or credentials needed? | None. Public Reels only |
| Does the run change anything on Instagram? | No. It only reads public pages |
| What does a call cost? | Reel events for the rows saved plus one start event, so sources × maxReelsPerSource is the ceiling |
| What if nothing is found? | outcome says why (VALID_EMPTY, INVALID_INPUT or UPSTREAM_FAILED) and no Reel is charged |
| Is the row shape stable? | Yes: 24 fields on every row, null when Instagram does not provide a value |
| Can the same call be repeated safely? | Yes. A Reel that appears in two sources is saved once per run |
Best results
| Starting situation | Helpful action | Expected outcome |
|---|---|---|
| A quick check of one account | Keep the default maxReelsPerSource of 12 | The latest page of Reels in seconds |
| Competitor benchmarking | Several usernames with onlyReelsNewerThan at 30 days | Comparable recent Reels per brand, read in parallel |
| Topic discovery | One or two focused hashtags | A sample of public Reels that use the tag in the caption |
| A list of known Reels | Put each link in directUrls | One fresh row per Reel |
| Saving videos | Download video_url right after the run | Media files while the CDN links are active |
| Ranking content | Compare plays_count with likes_count and comments_count | A clearer picture than any single metric |
Builder's note
I built this around three entry points because Reels research usually starts from an account, a topic or a link someone shared, and each needs a different route to the same row shape. I found that most Instagram runs that end early trace back to one data route being slow or unavailable, so the Actor keeps a second and third route ready and says in the run summary exactly what each source returned. I learned that analysts trust a dataset more when an empty result explains itself, so every outcome carries a reason you can read. Every row keeps its source_url, so a mixed run still shows which profile or tag produced each Reel. Hashtag rows are labeled as a sample through collection_method, so dashboards can treat topic pulls differently from complete profile pulls.
FAQ
Do I need an Instagram account?
No. The Actor reads public Reels and profiles without a login.
Can I search Reels by free-text keyword?
This Actor reads hashtags rather than free-text search. Put the topic in hashtags, such as travel or homeworkout, and each one returns a sample of public Reels whose captions include that tag. For today's most popular Reels across Instagram, use the Instagram Trending Reels Scraper when you want a global trending sample instead.
How long do the video links last?
video_url and thumbnail_url are Instagram CDN links that refresh over time, so download media soon after the run, or re-run with directUrls for fresh links.
Why do plays and views both appear?
Instagram reports them separately. They often match; when they differ, plays_count counts every playback.
Why did I get fewer Reels than maxReelsPerSource?
The account has fewer public Reels than you asked for, a date filter removed older ones, or the run stopped early. RUN_SUMMARY.sourceShortfalls names the reason for each source.
Why is follower_count empty?
Reels pages leave out follower totals. Run Instagram Profile Scraper on the same usernames when you need them.
Responsible use
This Actor collects public Instagram content and profile details that accounts choose to publish. Captions, handles and mentions can still be personal data under laws such as the GDPR, so use them with a lawful basis, respect creators' rights in their videos, and follow Instagram's terms. Read Apify's guide on whether web scraping is legal for more context. Instagram is a trademark of Meta Platforms, Inc. This independent Actor is not affiliated with or endorsed by Meta. For questions, open a ticket in the Issues tab.
Upstream outages and unverified responses are reported as UPSTREAM_FAILED when no usable data can be recovered. VALID_EMPTY requires a verified source response or a verified feed excluded by the date filter. Interrupted runs report PARTIAL, including when interrupted before saving rows. Invalid dates are rejected before contacting Instagram.