Instagram Reel Scraper - Plays, Likes
Pricing
from $0.34 / 1,000 reels
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
Maintained by CommunityActor stats
1
Bookmarked
71
Total users
42
Monthly active users
0.18 hours
Issues response
4 days ago
Last modified
Categories
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.
| Input | Instagram handles, profile URLs or numeric profile ids, or links to single reels |
| Output | One row per reel: plays, likes, comments, caption, hashtags, duration, MP4 link, cover image, audio, place, owner, co-authors |
| Ceiling | 1,000 reels per profile, 100 profiles and 100 reel links per run |
| Account needed | None |
| 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 get | Field |
|---|---|
| Link, shortcode and id | url, shortCode, id |
| The handle you asked for (for a reel link, the reel's account), and the tab or link it came from | inputUsername, inputUrl |
| Plays, likes and comments | videoPlayCount, videoViewCount, likesCount, commentsCount |
| Plays on Instagram, and on Facebook for a reel also shared there | igPlayCount, fbPlayCount |
| The place tagged on the reel | locationName, locationId |
| Caption, and the hashtags and handles in it | caption, hashtags, mentions |
| Length and frame size | videoDuration, dimensionsWidth, dimensionsHeight |
| Direct video file and cover image | videoUrl, displayUrl |
| Publish time | timestamp, takenAtTimestamp |
| Who posted it, and the co-authors | ownerUsername, ownerFullName, ownerId, ownerIsVerified, coauthorUsernames, coauthorProfiles |
| Tagged people and sponsors | taggedUsers, sponsorProfiles, isPaidPartnership |
| The sound, and a link to its file | hasAudio, audioId, audioTitle, audioArtist, audioIsOriginal, audioDurationMs, audioUrl |
| Pinned, hidden likes, comments off | isPinned, likesAndViewCountsDisabled, isCommentsDisabled |
▶️ How to scrape Instagram reels
- Open Instagram Reel Scraper and click Try for free.
- Put your handles into Instagram handles, one per line, or links to single reels into Reel links.
- Set Reels per profile. Start at 10 while you look at the output shape.
- Click Start.
- 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"}
| Field | Default | What it is |
|---|---|---|
usernames | none | nasa, @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. |
reelUrls | none | Links 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. |
resultsLimit | empty, runs as 30 | Rows per profile, 1 to 1,000. Pinned reels use these slots unless you skip them. |
onlyPostsNewerThan | none | A 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. |
skipPinnedPosts | off | Drop 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. |
maxItems | none | An overall ceiling across every handle, up to 5,000. A useful guard when you paste a long list. |
sessionCookies | none | Optional. Your own session, used only for your run. You are responsible for using it within the site's terms. |
proxyUrls | none | Optional. 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.
| Field | How to read it |
|---|---|
shortCode, id | Both stable. Either works as a dedupe key across runs. |
videoUrl, displayUrl | Direct signed links to the video file and the cover frame. They expire within hours. The url field does not expire. |
videoPlayCount | Plays 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, isCommentsDisabled | Tell you a missing count was switched off rather than being a real zero. |
audioIsOriginal | true for a sound the account made, false for a licensed track. |
isPaidPartnership | Instagram's own flag. sponsorProfiles stays empty when Instagram marks the partnership but names no sponsor. Nothing is guessed from the caption. |
igPlayCount, fbPlayCount | igPlayCount 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, locationId | The place tagged on the reel. Null when none is. |
audioUrl | A 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.
| Row | How to spot it | Billed |
|---|---|---|
| A reel | charged: true, recordType: "reel" and a shortCode | yes |
| The sample row | _sample: true, charged: false, and only on a run with no handles | no |
| A diagnostic | _diagnostic: true, recordType: "diagnostic" and an errorCode | no |
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:
| Code | What it means |
|---|---|
BAD_INPUT | Not a handle or a reel link, or a link to a photo post rather than a reel. |
NOT_FOUND | Instagram says there is no such account or reel, or the account is private. |
NOT_ON_REELS_TAB | A 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_AVAILABLE | A real account that will not answer a signed-out visitor. |
NO_RESULTS | A public account with no reels in the window you asked for. |
LIMIT_REACHED | The run's maxItems was used up by other handles before this one's reels. Nothing was charged for it. |
NOT_SERVED | This reel was not served this run. Re-run it later. Until 12 October 2026 this code was called BLOCKED. |
TIME_BUDGET | The run ran out of time before reaching that handle or link. |
DEAD_LIST | Six handles in a row returned nothing, so the run stopped rather than work through the rest. |
PROXY_INPUT_ADJUSTED | Something in proxyUrls could not be used as written. |
CHARGE_ERROR, UNEXPECTED_ERROR | Something 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
shortCodeto see what is new and how the play counts moved. - Working out what actually lands on an account before briefing a campaign: sort by
videoPlayCountand read the top ten captions. - Audio research.
audioIdandaudioIsOriginalshow 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:
- Run this on the handle with
onlyPostsNewerThanset to30 days. - Sort on
videoPlayCountand copy theurlof the top ten. - 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_LISTrow 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 want | Use |
|---|---|
| The reels on a profile's reels tab, or a recent reel from its link | This one |
| A profile plus everything on its grid, photos and carousels included | Instagram Scraper |
| A post of any kind, or an older reel, from its link | Instagram Post Scraper |
| Reels found by keyword or hashtag | Instagram Reels Search |
| Comments under a reel | Instagram Comments Scraper |
| The reels on a Facebook Page | Facebook 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.
Is scraping Instagram legal?
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.