Instagram Reels Scraper (Pay-Per-Event)
Pricing
from $1.00 / 1,000 reels
Instagram Reels Scraper (Pay-Per-Event)
Scrape Instagram Reels by profile, user ID, or direct reel URL. Returns all four Instagram play counters plus a playCountSource field, so view numbers never come back silently empty. Run-level dedup means you are never billed twice for the same reel.
Pricing
from $1.00 / 1,000 reels
Rating
0.0
(0)
Developer
Arnas
Maintained by CommunityActor stats
0
Bookmarked
7
Total users
5
Monthly active users
10 days ago
Last modified
Categories
Share
Instagram Reels Scraper
Scrape Instagram Reels by profile, numeric user ID, or direct reel URL. HTTP-only, with no login or user-supplied cookies. Pay-per-event: you pay for reels that actually land in your dataset.
What you get
Every row carries the full reel record — engagement, media URLs, audio, music attribution, tagged users, location, paid-partnership flags, and timestamps. See the dataset schema for all 41 fields.
View counts that don't silently come back empty
Instagram deprecated view_count and now populates its play counters inconsistently depending on
which surface serves the response. Scrapers that read one field return null views on a large
share of reels.
This actor emits all four counters on every row —
| Field | Instagram source |
|---|---|
videoPlayCount | play_count |
igPlayCount | ig_play_count |
videoViewCount | view_count (legacy, often null) |
fbPlayCount | fb_play_count |
— plus playCountSource, which names the field the number came from. If Instagram returned no
counter at all, playCountSource is null and you know it's missing rather than zero.
Highest-resolution video, explicitly
videoUrl is selected by pixel count across every rendition Instagram offers, so you get the
1080p file when one exists instead of whichever rendition happened to be listed first.
Run-level dedup and event-aware billing
Reels are deduplicated by Instagram media ID across the whole run. Pass a profile and one of its
reel URLs in the same input and you are charged once. Output admission is serialized, and each row
uses Apify's event-aware dataset write so budget admission, storage, and the reel charge result
share one SDK operation. Failed writes remain retryable, and no later row is admitted after the
charge limit is reached.
Input
| Field | Type | Default | Notes |
|---|---|---|---|
username | array | — | Required. Usernames, profile URLs, numeric user IDs, or direct reel URLs. |
resultsLimit | integer | 25 | Reels per profile. Ignored for direct reel URLs. |
onlyPostsNewerThan | string | — | YYYY-MM-DD, a full ISO timestamp, or relative (3 days, 2 weeks). UTC. |
skipPinnedPosts | boolean | false | Exclude reels pinned to the top of the profile. |
skipTrialReels | boolean | false | Exclude trial reels. Reels whose trial status Instagram does not report are kept. |
customMapFunction | string | — | Arrow function applied to each row before storage. |
maxRequestRetries | integer | 5 | Retries on a fresh session when blocked. |
proxyConfiguration | object | Apify RESIDENTIAL | Instagram blocks datacenter IPs. |
{"username": ["natgeo", "https://www.instagram.com/nasa/"],"resultsLimit": 50,"onlyPostsNewerThan": "3 months","skipPinnedPosts": true}
Migrating from apify/instagram-reel-scraper
Input field names and semantics match, so most runs transfer unchanged. Differences:
usernameadditionally accepts numeric user IDs.includeSharesCount,includeTranscript, andincludeDownloadedVideoare not implemented here, so those add-on charges do not exist. Core reel pricing is identical.- Extra fields on every row:
playCountSource,igPlayCount,fbPlayCount,fbLikeCount,reshareCount,isTrialReel,audioUrl,scrapedAt.
Output
{"id": "3512345678901234567","type": "Video","shortCode": "DAbCdEfGhIj","url": "https://www.instagram.com/reel/DAbCdEfGhIj/","caption": "Sunset over #Lisbon","hashtags": ["lisbon"],"likesCount": 1234,"commentsCount": 42,"videoPlayCount": 98765,"igPlayCount": 98765,"videoViewCount": null,"playCountSource": "play_count","videoDuration": 17.5,"videoUrl": "https://.../1080.mp4","displayUrl": "https://.../thumb.jpg","ownerUsername": "natgeo","timestamp": "2026-08-12T14:20:00.000Z"}
Pricing
Pay-per-event, identical to the reference actor's core tier schedule:
| Apify plan | Actor start | Per reel |
|---|---|---|
| Free | $0.001 | $0.0026 |
| Bronze | $0.001 | $0.0023 |
| Silver | $0.001 | $0.0014 |
| Gold | $0.001 | $0.0010 |
| Platinum | $0.001 | $0.0008 |
| Diamond | $0.001 | $0.0004 |
On the Free plan, 1,000 reels in one run cost $2.60 + $0.001. Rows skipped by a filter, by dedup, or by a failed push are not charged.
How it works
The actor first opens a normal public Instagram page to obtain an ephemeral logged-out session.
Profile pages expose the numeric user ID in their server-rendered Relay data. In that same
proxy/session, the actor pages Instagram's unified profile feed and keeps only
product_type: "clips". Each page gets a fresh bootstrap, so a blocked cookie can rotate cleanly
instead of poisoning every retry.
Direct reel URLs are parsed from the public page's server-rendered media object. The actor also checks the owner's current feed for richer play counters when the reel is recent enough to appear there; failure of this optional enrichment never discards the reel.
Residential proxies are required: Instagram blocks datacenter IP ranges.
Limitations
- Public profiles only. Private accounts are skipped with a warning; there is no login.
- A
/p/or/reel/URL pointing at a photo rather than a reel is reported and skipped. isTrialReelisnullwhen Instagram does not report trial status;skipTrialReelsthen keeps the reel rather than guessing.- No transcript, video download, or shares-count add-ons.

