Instagram Reel Scraper - $0.18 per 1,000 Reels avatar

Instagram Reel Scraper - $0.18 per 1,000 Reels

Deprecated

Pricing

from $0.18 / 1,000 reel scrapeds

Go to Apify Store
Instagram Reel Scraper - $0.18 per 1,000 Reels

Instagram Reel Scraper - $0.18 per 1,000 Reels

Deprecated

Give it Instagram handles and get that profile's reels feed newest-first: play count, likes, comments, duration, video URL, cover image and audio. No login, no cookies, no API key. The cheapest Instagram reel scraper on the market at $0.18 per 1,000 reels.

Pricing

from $0.18 / 1,000 reel scrapeds

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

Instagram Reel Scraper

Give it Instagram handles. Get back that profile's reels tab, newest first — one row per reel, with play count, likes, comments, duration, the video file URL, the cover image, and the audio track the reel was made with.

No Instagram login. No session cookie. No API key. No proxy of your own.

This is the cheapest Instagram reel scraper on the market: $0.18 per 1,000 reels.

Price

$0.18 per 1,000 reels, plus $0.0000125 to start a run (that start fee is charged once per gigabyte of run memory; at the default 1 GB it is a bit over one thousandth of a cent).

You are charged once per real reel written to the dataset, and for nothing else:

  • the labelled sample row you get when you run with empty input — free
  • diagnostic rows (private account, handle does not exist, Instagram refused) — free
  • pages fetched, retries, proxy addresses burned — free
ReelsCost
25$0.0045
250$0.045
1,000$0.18
10,000$1.80
100,000$18.00

One event, one price, every plan

$0.18 per 1,000 is the rate on the free plan and on every paid plan alike — there are no volume tiers to climb and no minimum spend, so the table above is what you pay from your very first run.

There is also only one billable event. This Actor has no paid add-ons: play counts, likes, comments, duration, dimensions, the video file URL, the cover image, the audio track and the co-author list are all fields of the same reel row, not extras metered separately. What it does not do is equally deliberate — it reads a profile's reels tab and nothing else. It does not transcribe audio, download and re-host video files, or resolve single reel URLs, so if you need those, this is the wrong tool rather than a cheaper one.

Where the money actually goes at scale. A page is always 12 reels (see Limits), so 1,000 reels is roughly 84 requests — the cost is dominated by the per-reel event, not by run time. A daily monitor over 30 accounts at 25 reels each is 750 reels, $0.135 a day, about $4 a month. Add onlyPostsNewerThan: "1 day" and you pay only for reels that are genuinely new.

Input

FieldWhat it does
usernamesOne entry per profile. "nasa", "@nasa", "https://www.instagram.com/nasa/" or a numeric profile id all work.
resultsLimitReels per profile, newest first. Default 25, maximum 1000.
onlyPostsNewerThanStop at a date. 2026-01-31, a full ISO timestamp, or a relative value like 3 months / 2 weeks / 7 days. UTC.
skipPinnedPostsLeave out reels the account pinned to the top of its reels tab — those are usually much older than the rest.
username, startUrlsAccepted aliases for usernames. Input field names follow the common conventions used across similar Actors, so an input written for another Instagram reel Actor usually runs here without editing.
proxyConfigurationOptional. Leave it empty and the Actor rotates Apify datacenter addresses, which is what works best here.
{
"usernames": ["nasa", "natgeo", "nike"],
"resultsLimit": 50,
"onlyPostsNewerThan": "3 months",
"skipPinnedPosts": true
}

Run it with no input at all and you get one labelled sample row, uncharged, showing the exact shape of a result before you spend anything.

Output

One row per reel. A real row from a run on nasa, trimmed only where the video URL would run off the page:

{
"type": "Video",
"productType": "clips",
"id": "3963765146907609231",
"shortCode": "DcCH2ZygIiP",
"url": "https://www.instagram.com/reel/DcCH2ZygIiP/",
"caption": "America's newest and most exciting aerospace technology expo and air show is landing at @NASAKennedy in Florida on Nov. 7-8. … #NASA #MaxPower #America250",
"hashtags": ["NASA", "MaxPower", "America250"],
"mentions": ["NASAKennedy"],
"videoPlayCount": 2441421,
"videoViewCount": 2441421,
"likesCount": 43361,
"commentsCount": 429,
"videoDuration": 76.69300079345703,
"videoUrl": "https://scontent-ord5-2.cdninstagram.com/o1/v/t2/f2/m86/AQNh2ps9dzDCDRClcPrhnvk6…mp4",
"displayUrl": "https://scontent-ord5-2.cdninstagram.com/v/t51.2885-15/…jpg",
"dimensionsWidth": 1080,
"dimensionsHeight": 1920,
"timestamp": "2026-08-14T18:41:26.000Z",
"takenAtTimestamp": 1786737686,
"ownerUsername": "nasa",
"ownerFullName": "NASA",
"ownerId": "528817151",
"ownerIsVerified": true,
"coauthorUsernames": [],
"isPinned": false,
"isPaidPartnership": false,
"hasAudio": true,
"audioId": "37739766162335392",
"audioTitle": "Original audio",
"audioArtist": "nasa",
"audioIsOriginal": true,
"audioDurationMs": 76676,
"inputUsername": "nasa",
"inputUrl": "https://www.instagram.com/nasa/reels/",
"scrapedAt": "2026-08-15T02:12:44.318Z"
}

Field coverage

Measured over a real 100-reel run on nasa, not estimated:

FieldPresent
id, shortCode, url, timestamp, ownerUsername, ownerId100%
videoPlayCount, videoViewCount, likesCount, commentsCount100%
videoDuration, videoUrl, displayUrl, dimensionsWidth, dimensionsHeight100%
audioTitle, audioArtist, audioIsOriginal100%
hashtags (non-empty)41%

hashtags is empty on the rest because those captions genuinely have no hashtags — an empty array is the honest answer. Missing values are null, never a guess.

videoPlayCount and videoViewCount carry the same number — Instagram now serves a single play count for reels, and both names are kept so a pipeline written against either one keeps working.

Output field names follow the conventions used across Instagram reel Actors, so switching over usually means changing the Actor id and nothing else.

Limits

Read this before you build on it.

  • A page is always 12 reels. Instagram's clips endpoint accepts a page_size parameter and then ignores it — 12, 20, 30, 50 and 100 all returned exactly 12 items and a byte-identical body. So resultsLimit: 500 is 42 requests, not 5. It still runs, it is just not instant.
  • Public accounts only. A private account returns a free diagnostic row saying so. There is no login here and no way around that.
  • Collab reels appear. If another account posted a reel and this account is a co-author, Instagram shows it in the reels tab and so does this Actor. ownerUsername is then the poster, not the account you asked for, and coauthorUsernames lists the collaborators. That mirrors what a person sees on the page.
  • No single reel URLs. This scrapes a profile's reels feed. Paste a /reel/<code>/ URL and you get a free diagnostic row telling you so, not a charge. Instagram's keyless single-media endpoint is login-walled (6/6 attempts returned 429 from fresh addresses in testing).
  • No share counts, no transcripts, no downloaded video files. Share count is not in the payload this reads. Transcription and video downloading are deliberately out of scope — they are what makes other reel scrapers expensive.
  • Video URLs expire. Instagram's CDN links are signed and time-limited, typically hours. Fetch the file promptly if you need a copy; the reel url and shortCode stay valid forever.
  • videoDuration is in seconds, as a float (76.693), not milliseconds.
  • Very deep history is capped at 1,000 reels per profile by resultsLimit.

FAQ

Do I need an Instagram account, cookie or token? No. Nothing to log in to, nothing to paste, nothing to keep alive.

Does it work on any public profile? Yes — personal, creator and business accounts. Private accounts are not readable by anyone who does not follow them, so they return a free diagnostic row instead.

What does it cost to scrape 1,000 Instagram reels? $0.18, plus a start fee of $0.0000125 per gigabyte of run memory.

How fast is it? 100 reels from one profile in 31 seconds, on the platform, on default settings. A page is 12 reels, so a bigger pull is mostly page count: 12 reels across two profiles finished in 11 seconds.

Are the play counts real? Yes, they are the numbers Instagram itself serves to the reels tab: play_count, like_count, comment_count, straight through with no estimation.

Can I get reels published after a certain date only? Yes — onlyPostsNewerThan. Pinned reels are handled correctly: an old pinned reel sitting at the top of the tab does not end the walk early.

Can I export to CSV or Excel? Yes. Apify exports the dataset as JSON, CSV, Excel or XML, and the same data is on a REST endpoint.

What happens if a run finds nothing? You get an uncharged diagnostic row explaining why, and the run finishes as succeeded. You are never charged for a reel you did not receive.

Is this affiliated with Instagram or Meta? No. It reads publicly visible data. Check Instagram's terms and your own local rules before using the output commercially.

How it works

Instagram's reels tab is served by POST /api/v1/clips/user/ — the same call the website makes when you open instagram.com/<handle>/reels/. Three things had to line up to call it without an account, and each one was measured rather than assumed:

  1. TLS fingerprint. Plain Node gets 401 require_login on the first request. The same request through a real Chrome handshake returns HTTP 200 and a full payload from the same address in the same second. The block was never about the IP.
  2. A CSRF token. The POST answers 403 without one. GET /data/shared_data/ is a 34 KB public endpoint that hands back config.csrf_token and the cookies that go with it, so the session is built from that rather than from a login.
  3. A fresh exit address on refusal. These endpoints are metered per IP, and a spent address is answered with 401 "Please wait a few minutes" — not a 403, and not a 429. Waiting on it does nothing, so a refusal builds a brand-new session on a different datacenter address instead.

Datacenter addresses, not residential. The payload is about 53 KB per reel; at the $8/GB residential rate that would be $0.42 of bandwidth per 1,000 reels — more than twice this Actor's whole price. Rotating datacenter exits costs nothing per gigabyte and gives a much larger pool to hop around, which is exactly what a per-IP meter needs. That is why this can be the cheapest Instagram reel scraper on Apify and still make money.