Instagram Reel Scraper - Plays, Likes avatar

Instagram Reel Scraper - Plays, Likes

Pricing

from $0.34 / 1,000 reels

Go to Apify Store
Instagram Reel Scraper - Plays, Likes

Instagram Reel Scraper - Plays, Likes

Scrape the reels on a public Instagram profile. One row per reel: play count, likes, comments, caption, hashtags, duration, cover image, audio and co-authors. Pinned reels come first and are flagged, so sort by date if you want the newest. $0.35 per 1,000 reels.

Pricing

from $0.34 / 1,000 reels

Rating

5.0

(1)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

1

Bookmarked

71

Total users

42

Monthly active users

0.18 hours

Issues response

4 days ago

Last modified

Share

Name a public Instagram handle and get its reels tab back as rows: play count, likes, comments, the caption with hashtags and mentions split out, duration, a direct MP4 link, the cover image and the audio track behind each reel. One reel's link works too.

The thing that catches people out: a creator can pin reels to the top of their own tab, so the first rows are not the newest ones. Pinned reels are kept by default, come first and carry isPinned, and every row has its real publication time so you can sort however you like.

InputInstagram handles, profile URLs or numeric profile ids, or links to single reels
OutputOne row per reel: plays, likes, comments, caption, hashtags, duration, MP4 link, cover image, audio, place, owner, co-authors
Ceiling1,000 reels per profile, 100 profiles and 100 reel links per run
Account neededNone
Price$0.35 per 1,000 reels on the free plan, down to $0.335 on Business. The free plan's $5 a month covers about 14,000

🔍 What Instagram Reel Scraper does

It reads the public reels tab of the handles you name, one row per reel, and stops when it reaches your limit or your date cut-off. Several profiles are read at once, so a list of thirty handles is not thirty times slower than one.

Nothing to log into. No API key, no cookie, no app review.

Collab reels are handled properly. A reel published by two accounts sits on both tabs, so ownerUsername is whoever actually posted it and inputUsername is the handle you asked for. Those two differ often. The same reel found under two of your handles is delivered once, not twice.

A handful of otherwise-public accounts are closed to visitors who are not signed in. Those come back as a labelled row rather than silently empty.

A reel link gets the same row, play count included, if the reel is among the 20 or so newest on its account's tab; older ones get a free row.

📋 What data you get from each Instagram reel

What you getField
Link, shortcode and idurl, shortCode, id
The handle you asked for (for a reel link, the reel's account), and the tab or link it came frominputUsername, inputUrl
Plays, likes and commentsvideoPlayCount, videoViewCount, likesCount, commentsCount
Plays on Instagram, and on Facebook for a reel also shared thereigPlayCount, fbPlayCount
The place tagged on the reellocationName, locationId
Caption, and the hashtags and handles in itcaption, hashtags, mentions
Length and frame sizevideoDuration, dimensionsWidth, dimensionsHeight
Direct video file and cover imagevideoUrl, displayUrl
Publish timetimestamp, takenAtTimestamp
Who posted it, and the co-authorsownerUsername, ownerFullName, ownerId, ownerIsVerified, coauthorUsernames, coauthorProfiles
Tagged people and sponsorstaggedUsers, sponsorProfiles, isPaidPartnership
The sound, and a link to its filehasAudio, audioId, audioTitle, audioArtist, audioIsOriginal, audioDurationMs, audioUrl
Pinned, hidden likes, comments offisPinned, likesAndViewCountsDisabled, isCommentsDisabled

▶️ How to scrape Instagram reels

  1. Open Instagram Reel Scraper and click Try for free.
  2. Put your handles into Instagram handles, one per line, or links to single reels into Reel links.
  3. Set Reels per profile. Start at 10 while you look at the output shape.
  4. Click Start.
  5. Download the dataset as JSON, CSV or Excel, or read it from the Apify API.

Start a run with nothing filled in and you get one labelled sample row showing the exact output shape. That row is not charged.

💰 How much does it cost to scrape Instagram reels?

$0.35 per 1,000 reels. That is the free plan's price; paid plans pay a little less: $0.345 on Starter, $0.34 on Scale and $0.335 on Business. On the free plan, the $5 Apify gives you each month covers about 14,000 reels.

One charge per reel row delivered. A reel filtered out by your date cut-off or by skipPinnedPosts never becomes a row, so it is never billed. The same reel found under two handles is billed once. Sample rows, diagnostic rows and a handle that turns out to have no reels are not billed for results. A reel link is billed like any other reel.

📥 What you give it

{
"usernames": ["nasa", "natgeo", "https://www.instagram.com/nike/"],
"resultsLimit": 30,
"onlyPostsNewerThan": "3 months"
}
FieldDefaultWhat it is
usernamesnonenasa, @nasa, a full profile URL or a numeric profile id. Mix them freely. Up to 100 per run. A reel link pasted here is read as a reel link.
reelUrlsnoneLinks to single reels, or their shortcodes. Up to 100 per run. Each comes back as one reel row with its play count when the reel is among the 20 or so newest on its account's reels tab; an older one gets a free NOT_ON_REELS_TAB row.
resultsLimitempty, runs as 30Rows per profile, 1 to 1,000. Pinned reels use these slots unless you skip them.
onlyPostsNewerThannoneA day (2026-05-01) or a window (3 months, 2 weeks, 10 days); the form gives you a calendar. Days count in UTC, and pinned reels are checked against their real publication date too. A value that is not a date stops the run with a BAD_INPUT row before anything is read.
skipPinnedPostsoffDrop the reels the account pinned. Leave it off to keep them, first in the list and marked with isPinned, the way the tab shows them.
maxItemsnoneAn overall ceiling across every handle, up to 5,000. A useful guard when you paste a long list.
sessionCookiesnoneOptional. Your own session, used only for your run. You are responsible for using it within the site's terms.
proxyUrlsnoneOptional. Servers of your own you want the run to use, as http://user:pass@host:port.

📤 What you get back

A real row from a run on 30 September 2026. The media and picture links are trimmed with ..., and the co-author and tagged lists are cut to their first entry (they held two and three):

{
"ok": true,
"charged": true,
"recordType": "reel",
"inputUsername": "nasa",
"shortCode": "DdhFkS7KGkZ",
"url": "https://www.instagram.com/reel/DdhFkS7KGkZ/",
"caption": "Our first Leader of the Uprising 🔥\n\nTune in on @paramountplus / @nfloncbs",
"videoPlayCount": 7207444,
"likesCount": 47088,
"commentsCount": 596,
"videoDuration": 23.381000518798828,
"videoUrl": "https://scontent-iad6-1.cdninstagram.com/o1/v/t2/f2/m86/...",
"displayUrl": "https://scontent-iad6-1.cdninstagram.com/v/t51.82787-15/...",
"audioTitle": "Original audio",
"ownerUsername": "ravens",
"isPinned": false,
"id": "3990495229280545049",
"type": "Video",
"productType": "clips",
"hashtags": [],
"mentions": ["paramountplus", "nfloncbs"],
"videoViewCount": 7207444,
"dimensionsWidth": 1080,
"dimensionsHeight": 1920,
"takenAtTimestamp": 1789924800,
"timestamp": "2026-09-20T17:20:00.000Z",
"ownerFullName": "Baltimore Ravens",
"ownerId": "231432514",
"ownerIsVerified": true,
"coauthorUsernames": ["astro_reid", "nasa"],
"coauthorProfiles": [
{"id": "59096690402", "username": "astro_reid", "fullName": "Reid Wiseman", "profileUrl": "https://www.instagram.com/astro_reid/", "profilePicUrl": "https://scontent-iad3-2.cdninstagram.com/...", "isVerified": true, "isPrivate": false}
],
"taggedUsers": [
{"id": "205593849", "username": "nfl", "fullName": "NFL", "profileUrl": "https://www.instagram.com/nfl/", "profilePicUrl": "https://scontent-iad3-2.cdninstagram.com/...", "isVerified": true, "isPrivate": false, "x": 0, "y": 0}
],
"sponsorProfiles": [],
"isPaidPartnership": false,
"likesAndViewCountsDisabled": false,
"isCommentsDisabled": false,
"hasAudio": true,
"audioId": "28784844067777520",
"audioArtist": "ravens",
"audioIsOriginal": true,
"audioDurationMs": 23000,
"inputUrl": "https://www.instagram.com/nasa/reels/",
"scrapedAt": "2026-09-30T16:04:16.706Z"
}

That row is a good example of the collab case. It was found under nasa, but the Ravens posted it and NASA is one of the co-authors.

FieldHow to read it
shortCode, idBoth stable. Either works as a dedupe key across runs.
videoUrl, displayUrlDirect signed links to the video file and the cover frame. They expire within hours. The url field does not expire.
videoPlayCountPlays at the moment of reading, as Instagram's public page gives them. videoViewCount carries the same number. Facebook plays are in it only when fbPlayCount is filled.
likesAndViewCountsDisabled, isCommentsDisabledTell you a missing count was switched off rather than being a real zero.
audioIsOriginaltrue for a sound the account made, false for a licensed track.
isPaidPartnershipInstagram's own flag. sponsorProfiles stays empty when Instagram marks the partnership but names no sponsor. Nothing is guessed from the caption.
igPlayCount, fbPlayCountigPlayCount is plays on Instagram. When the page also carries a Facebook figure, fbPlayCount is filled and videoPlayCount is the two added together. When fbPlayCount is null the page carried none, and videoPlayCount is Instagram's plays alone, even if the reel was also shared to Facebook.
locationName, locationIdThe place tagged on the reel. Null when none is.
audioUrlA link to the sound file. It expires within hours, like videoUrl.

Those columns on a real row from 17 October 2026:

{
"shortCode": "DFagB_uNmEj",
"videoPlayCount": 7875395,
"locationName": "Yamagata",
"locationId": "409706962740944",
"igPlayCount": 7835914,
"fbPlayCount": 39481,
"audioUrl": "https://video-den2-1.xx.fbcdn.net/o1/v/t2/f2/m69/..."
}

🧾 Reading the output

Three kinds of row land in your dataset, and only the first kind is billed.

RowHow to spot itBilled
A reelcharged: true, recordType: "reel" and a shortCodeyes
The sample row_sample: true, charged: false, and only on a run with no handlesno
A diagnostic_diagnostic: true, recordType: "diagnostic" and an errorCodeno

Filter on charged == true and you have your reels. The sample row also says recordType: "reel", so charged is the safer filter. Read it as the marker of a real row, not as a receipt.

The errorCode on a diagnostic names the handle it belongs to and says what happened:

CodeWhat it means
BAD_INPUTNot a handle or a reel link, or a link to a photo post rather than a reel.
NOT_FOUNDInstagram says there is no such account or reel, or the account is private.
NOT_ON_REELS_TABA reel link whose reel is not among the newest on its account's reels tab, where its play count is read. Instagram Post Scraper reads it without the play count. Nothing was charged.
NOT_AVAILABLEA real account that will not answer a signed-out visitor.
NO_RESULTSA public account with no reels in the window you asked for.
LIMIT_REACHEDThe run's maxItems was used up by other handles before this one's reels. Nothing was charged for it.
NOT_SERVEDThis reel was not served this run. Re-run it later. Until 12 October 2026 this code was called BLOCKED.
TIME_BUDGETThe run ran out of time before reaching that handle or link.
DEAD_LISTSix handles in a row returned nothing, so the run stopped rather than work through the rest.
PROXY_INPUT_ADJUSTEDSomething in proxyUrls could not be used as written.
CHARGE_ERROR, UNEXPECTED_ERRORSomething went wrong that did not fit the list above.

A bad handle never fails the run. It gets its row and the rest of your list carries on.

💡 What people use it for

  • Tracking a set of creators week by week, then diffing on shortCode to see what is new and how the play counts moved.
  • Working out what actually lands on an account before briefing a campaign: sort by videoPlayCount and read the top ten captions.
  • Audio research. audioId and audioIsOriginal show which sounds an account leans on and which of them it made itself.

From a creator's reels to the scripts that worked, in three steps:

  1. Run this on the handle with onlyPostsNewerThan set to 30 days.
  2. Sort on videoPlayCount and copy the url of the top ten.
  3. Watch those and note what the best ones open with.

🚧 What it does not do

  • Reels only. No photo posts, carousels, stories or highlights.
  • No share, save or repost counts. Instagram hides them from signed-out visitors.
  • No private accounts, and no way around that.
  • Counts are a snapshot. Two runs an hour apart will disagree, and both are right. Plays may leave out Facebook.
  • Video and cover links expire within hours.
  • Deduplication is inside a run, not across runs. Two runs over the same handle return the same reels again.
  • Six empty handles in a row stop the run early, with a DEAD_LIST row saying so. It is there to stop a list of dead handles quietly eating your time.
  • No comment text, no liker lists, no follower counts. Those live in other actors.
  • 100 handles and 1,000 reels per handle per run. Bigger jobs need splitting.
  • It is not an official Instagram tool. Dami's Studio is independent and is not affiliated with or endorsed by Instagram or Meta, or by any other company named on this page.

🧭 Which Instagram scraper do you need?

If you wantUse
The reels on a profile's reels tab, or a recent reel from its linkThis one
A profile plus everything on its grid, photos and carousels includedInstagram Scraper
A post of any kind, or an older reel, from its linkInstagram Post Scraper
Reels found by keyword or hashtagInstagram Reels Search
Comments under a reelInstagram Comments Scraper
The reels on a Facebook PageFacebook Reels Scraper

❓ Questions people ask

Do I need an Instagram account to scrape reels?

No. Leave everything optional empty and it runs.

Why did I get a reel owned by someone else?

Collab reels sit on both accounts' tabs. ownerUsername is who posted it, inputUsername is the handle you asked for.

How do I get only the newest reels?

Set onlyPostsNewerThan. The run stops walking a profile once it passes your cut-off, so a daily schedule reads only what is new.

Why do the numbers differ from what I see in the app?

Plays and likes keep climbing, and each row holds them as they were when it was read. If an account comes back NOT_AVAILABLE, open it in a private browser window: if Instagram asks you to log in there, that is why it came back NOT_AVAILABLE.

Can I call it from code or connect it to an AI assistant?

Yes. The API tab has ready-made code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/instagram-reel-scraper. Either way the run happens on your Apify account at the same price.

This reads public profiles only, never private accounts or messages. Results can still contain personal data, which GDPR and similar laws cover, so have a reason for collecting it. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page. Send the handles you used and the run ID. The errorCode on the diagnostic row usually explains it on its own.