Instagram Reels Scraper — Profiles, Hashtags & Reel URLs avatar

Instagram Reels Scraper — Profiles, Hashtags & Reel URLs

Pricing

from $0.90 / 1,000 reel extracteds

Go to Apify Store
Instagram Reels Scraper — Profiles, Hashtags & Reel URLs

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

Khadin Akbar

Maintained by Community

Actor stats

1

Bookmarked

319

Total users

45

Monthly active users

a day ago

Last modified

Features

Limited permissions

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 are null, 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 includeCollabReels off 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 maxReelsPerSource scales up to 500 for deeper research. If a profile has fewer public Reels, RUN_SUMMARY.sourceShortfalls says so.
  • Use directUrls when 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_url values 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
}
InputWhat it controls
usernamesInstagram handles or profile URLs, such as natgeo or https://www.instagram.com/natgeo/
hashtagsTopic keywords without the #, such as travel or fitness
directUrlsReel links on instagram.com using /reel/ or /p/ paths, each as {"url": "..."}
maxReelsPerSourceReels 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
includeCollabReelsProfiles only. On by default: include collab Reels where the profile is a co-author. Off keeps only Reels the profile posted itself
onlyReelsNewerThanDate 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/"
}
FieldWhat it contains
reel_id, reel_urlReel shortcode and its Instagram link
username, display_name, profile_urlThe account that posted the Reel
follower_countAccount followers; often null because Reels pages leave it out. Use the profile Actor below for follower totals
caption, hashtags, mentionsFull caption plus hashtags and mentioned accounts parsed from it
collaboratorsCollab co-authors. Profile runs include collab Reels that show on the profile's Reels tab
likes_count, comments_countLikes and comments at collection time
views_count, plays_countView and play counts at collection time
duration_secondsReel length in seconds
video_url, thumbnail_urlDirect video file and cover image links; download them soon after the run
audio_title, audio_artistThe sound: Original audio with the creator's handle, or the licensed track and artist
is_sponsored, is_pinnedPaid-partnership flag, and the pinned flag when the profile exposes it
posted_at, scraped_atPublish time and collection time (ISO 8601)
source_urlThe profile, hashtag page or Reel link that produced the row
collection_methodPresent 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:

outcomeWhat it meansWhat to do
COMPLETEEvery source gave the requested number of Reels or reached the end of its public feedNothing; use the dataset
PARTIALSome Reels were saved, but a source stopped early, such as at the run timeout or the charge limitCheck RUN_SUMMARY.sourceShortfalls, then raise the timeout or charge limit, or request fewer sources per run
VALID_EMPTYA source was verified and has no Reels: the profile is missing, private or has none, or all its Reels are older than onlyReelsNewerThanCheck the username, or widen the date filter
INVALID_INPUTThe 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 ReelFix the input named in message and run again
UPSTREAM_FAILEDEvery data route was unavailable and nothing could be saved. No Reel is chargedRun again later
CONFIG_ERRORThe Actor build has no data route configuredOpen 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.
  • maxReelsPerSource caps 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 ApifyClient
client = 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:

  1. Calls khadinakbar/instagram-reels-scraper with usernames, maxReelsPerSource: 10 and onlyReelsNewerThan: "30 days".
  2. Reads the rows with get-dataset-items; each row is one Reel with caption, hashtags, mentions and engagement counts.
  3. Sorts by plays_count and groups by hashtags and mentions before answering.
  4. Checks OUTPUT for the run outcome and itemsPushed, and treats hashtag rows as a topic sample. Cost scales with Reels returned, so it keeps maxReelsPerSource close to the request.

Facts an agent can plan with:

QuestionAnswer
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 situationHelpful actionExpected outcome
A quick check of one accountKeep the default maxReelsPerSource of 12The latest page of Reels in seconds
Competitor benchmarkingSeveral usernames with onlyReelsNewerThan at 30 daysComparable recent Reels per brand, read in parallel
Topic discoveryOne or two focused hashtagsA sample of public Reels that use the tag in the caption
A list of known ReelsPut each link in directUrlsOne fresh row per Reel
Saving videosDownload video_url right after the runMedia files while the CDN links are active
Ranking contentCompare plays_count with likes_count and comments_countA 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.

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.