Instagram Reels Scraper avatar

Instagram Reels Scraper

Pricing

from $1.20 / 1,000 reel scrapeds

Go to Apify Store
Instagram Reels Scraper

Instagram Reels Scraper

Scrape a public Instagram account's reels without a login. Give a list of usernames and get back each reel as a clean row: permalink, owner, play, like and comment counts, caption, duration, post date, video and thumbnail URLs. Pagination is walked automatically up to your chosen limit per account.

Pricing

from $1.20 / 1,000 reel scrapeds

Rating

0.0

(0)

Developer

Goutam Soni

Goutam Soni

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

4 days ago

Last modified

Share

Instagram Reels Scraper - Export Reels, Play Counts, Captions & Video URLs

Scrape Instagram Reels in bulk by username. Get play counts, likes, comments, full captions, exact video duration, post dates, and direct video and thumbnail URLs, without an Instagram API key, login, or cookies.

What this Instagram Reels scraper does

Pass a list of Instagram usernames (plain handles, @handles, or profile URLs, mixed freely) and the actor returns one clean JSON row per reel. Pagination is walked automatically page after page until it hits the cap you set or the account runs out of reels, so a request for 500 reels really does walk the whole feed rather than stopping at the first page.

Perfect for short-form content research, creator vetting, competitor tracking, trend spotting, and video dataset building on Instagram at scale.

Why use this Instagram Reels scraper

  • No API key, no login, no cookies. Works on any public Instagram account. You never hand over an Instagram account or a password.
  • Real play counts. Every row carries the reel's play count alongside likes and comments, so you can rank by actual reach rather than guessing from likes.
  • Direct video URLs. Each row includes a downloadable MP4 link, so you can archive or analyse the video itself, not just its metrics.
  • Exact duration in seconds. Parsed from the video stream rather than rounded, which matters when you are studying hook length or retention.
  • Deep pagination. Ask for 20 reels or 5,000 and the scraper keeps fetching until your cap is reached.
  • Bulk by username. Several accounts processed in parallel in a single run.
  • Residential proxies built in with rotating IPs.
  • Multi-source failover. If one upstream is rate-limited, the actor falls back to another, so runs almost always finish.

What data you get per reel

FieldTypeDescription
typestringRecord type, always "reel"
queryUsernamestringThe account you asked for (handy for grouping multi-account runs)
shortcodestringURL slug (instagram.com/reel/{shortcode})
urlstringPermalink to the reel
ownerUsernamestringUsername of the account that posted
ownerFullNamestringDisplay name of the poster
ownerIdstringNumeric Instagram user ID of the poster
ownerIsVerifiedbooleanVerified badge on the poster
playCountintegerNumber of plays
likeCountintegerNumber of likes
commentCountintegerNumber of comments
captionstringFull caption text, with hashtags, mentions and emojis
durationSecsnumberVideo length in seconds
takenAtstringWhen the reel was posted (ISO 8601 UTC)
videoUrlstringDirect MP4 video URL
thumbnailUrlstringCover image URL
scrapedAtstringWhen the row was scraped (ISO 8601 UTC)

How to use the Instagram Reels Scraper

  1. Click Try for free on the actor page.
  2. Enter Instagram usernames in the usernames input. Plain usernames, @handles, and profile URLs all work and are deduplicated.
  3. Set maxReelsPerUser (default 100, up to 5,000) to cap how many reels come back per account.
  4. Tune concurrency (default 3, up to 10) for your speed and safety tradeoff.
  5. Click Save & start. Download in JSON, CSV, Excel, XML or HTML, or stream via API.

Example input

{
"usernames": ["example_brand", "example_user"],
"maxReelsPerUser": 500,
"concurrency": 3
}

Example output

{
"type": "reel",
"queryUsername": "example_brand",
"shortcode": "CabcdEFghij",
"url": "https://www.instagram.com/reel/CabcdEFghij/",
"ownerUsername": "example_brand",
"ownerFullName": "Acme Co",
"ownerId": "100000001",
"ownerIsVerified": true,
"playCount": 1204338,
"likeCount": 85210,
"commentCount": 642,
"caption": "Launch day. Three years in the making.",
"durationSecs": 30.5,
"takenAt": "2026-07-19T15:00:00.000Z",
"videoUrl": "https://example.com/video.mp4",
"thumbnailUrl": "https://example.com/cover.jpg",
"scrapedAt": "2026-07-21T09:00:00.000Z"
}

Top use cases

  • Short-form content strategy. Compare hook length, duration and caption style against play counts to work out what actually travels in your niche.
  • Creator and influencer vetting. Judge candidates on real play counts and engagement rather than follower count alone.
  • Competitor monitoring. Track every reel a rival publishes and how each one performed.
  • Trend spotting. Pull the top reels across a set of accounts in a niche and spot formats before they saturate.
  • Ad creative research. Study high-performing organic reels before committing paid budget.
  • Video dataset building. Direct MP4 URLs plus captions make a clean corpus for analysis or model training.
  • Campaign reporting. Snapshot reel metrics on a schedule and chart performance over time.

Integrations

Apify API

$curl "https://api.apify.com/v2/datasets/{DATASET_ID}/items?format=json"

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("goat255/instagram-reels-scraper").call(run_input={
"usernames": ["example_brand", "example_user"],
"maxReelsPerUser": 200,
})
reels = list(client.dataset(run["defaultDatasetId"]).iterate_items())
reels.sort(key=lambda r: r.get("playCount") or 0, reverse=True)
for reel in reels[:10]:
print(f"{reel['playCount']:>10,} plays {reel['durationSecs']}s {reel['url']}")

JavaScript / Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('goat255/instagram-reels-scraper').call({
usernames: ['example_brand', 'example_user'],
maxReelsPerUser: 200,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const topReel = items.sort((a, b) => (b.playCount || 0) - (a.playCount || 0))[0];
console.log(`Top reel: ${topReel.url} with ${topReel.playCount} plays`);

No-code integrations

Stream results to Google Sheets, Slack, Zapier, Make, Amazon S3, HubSpot, or any webhook via Apify Integrations.

Pricing

Pay per result. No subscription. No per-run start fee. You only pay for the reels you actually receive.

EventPrice
Reel scraped (primary)$0.0012

Apify's $5 platform free credit applies on first use, which is roughly 4,000 free reels to start.

FAQ

Do I need an Instagram account or API key?

No. The scraper works on any public Instagram account without a login, cookies, or the Instagram Graph API.

Can it scrape reels from private accounts?

No. Private accounts do not expose their reels. A private target returns a single row with ok: false and error: "private_account", so you can tell it apart from an account that simply has no reels.

How many reels can I get per account?

Up to 5,000 per account per run. Pagination is walked automatically, so setting maxReelsPerUser to 500 returns 500 reels if the account has them, not just the first page.

Why did I get fewer reels than I asked for?

The account ran out of reels. Ask for 500 on an account with 80 reels and you get 80 real rows rather than 500 padded ones. The run log states the count per account.

Does it return the actual video file?

Yes. Every row carries a direct MP4 link in videoUrl plus a cover image in thumbnailUrl. Instagram media links are time-limited, so download promptly if you need to archive the file.

Are the play counts live?

Yes. Metrics are read at the moment of the scrape, not from a cache.

Can I export to CSV, Google Sheets or Excel?

Yes. JSON, CSV, Excel, XML and HTML are all supported, plus direct integrations to Google Sheets, Zapier, Make, Slack and S3.

What happens if an account cannot be reached?

The run does not fail. The actor emits a row with ok: false and a generic reason (not_found, private_account, upstream_rate_limit, or upstream_unavailable) and carries on with the rest of your list.

Support

Found a bug or a missing field? Open an issue on the actor page. Reviews are read and replied to.

Privacy

To improve our actors we collect anonymized usage telemetry (run stats and input patterns). No personal account data is collected.