Instagram Reels scraper API: views, MP4 links and search
An Instagram Reels scraper API returns public reels as JSON: a Reels tab with views (2 credits), one reel with its MP4 (1) and keyword search (3).
By Scrape Everything team · · 11 min read
Last updated: October 21, 2026
TL;DR: An Instagram Reels scraper API returns public Reels data as JSON without an Instagram login. With Scrape Everything, an account's Reels tab (up to 50 reels with views) costs 2 credits, one reel with caption, audio and an MP4 link costs 1 credit, and keyword search costs 3 credits.
Three endpoints, because people ask three things about Reels: what is this account posting, what is in this one reel, and what exists for this topic. The per-reel cost is further down.
Profiles have their own post, how to scrape Instagram profiles with an API, and the official route is in Instagram Graph API vs a scraper API. This one is only about Reels.
What is an Instagram Reels scraper API?
An Instagram Reels scraper API is a web service that reads the Reels data Instagram shows to logged-out visitors and returns it as structured JSON over HTTP. You send a username, a reel URL or a keyword. The service deals with fetching, proxies, retries and parsing.
Scrape Everything is a REST API for public social media data, returned as clean JSON. It covers 9 platforms (Instagram, TikTok, X, YouTube, Facebook, Telegram, Spotify, Pinterest and Twitch) and is not affiliated with Instagram or Meta.
How do Instagram Reels scraper APIs compare?
Search results for this query are mostly Apify Actors, Bright Data and DIY libraries like Instaloader.
| Option | Pricing model | Free tier | Best when |
|---|---|---|---|
| Scrape Everything | One-time credit packs, credits never expire | 100 free credits | You want synchronous JSON with one schema across 9 platforms |
| Apify (Reels Actors) | Monthly platform plan plus per-Actor pricing | $5 of usage per month | You want scheduling and storage, or sites beyond social media |
| Bright Data | $1.50 per 1,000 records pay as you go, or monthly plans | 5,000 records per month | You need enterprise contracts, datasets or proxies |
| Instaloader (DIY) | Free, open source | Free | You're happy to run IPs, retries and fixes yourself |
| Meta Instagram Platform | Official API, terms set by Meta | See Meta's docs | You want insights on accounts you own or manage |
Product names are trademarks of their owners; we are not affiliated with them. Figures from each vendor's public pricing page, verified October 22, 2026. Spot an error? Email [email protected] and we correct it.
Prices change, so check before you commit.
Instaloader is a good library for a few downloads. At volume, Instagram rate-limits logged-out traffic, and proxies, sessions and parser fixes become your weekend. That's the work you pay an API to absorb.
Which endpoint returns which Reels fields?
Instagram splits the data across two pages, hence separate endpoints.
| Endpoint | Input | Cost | What you get | What you don't get |
|---|---|---|---|---|
instagram.reels | username | 2 credits | Up to 50 reels from the Reels tab: shortcode, link, views, likes, comments, cover image, approximate publish time, pinned flag, plus profile basics | Captions, exact publish time, duration, video URL |
instagram.reel | reel URL or shortcode | 1 credit | Owner, full caption, likes, comments, views, exact publish time, duration, resolution, audio, cover image, MP4 link with expiry | Comments (use instagram.comments) |
instagram.reels_search | keyword | 3 credits | About 10 reels per results page, each opened for the same details as instagram.reel | Instagram's own search ranking |
instagram.profile | username | 1 credit | Bio, follower, following and post counts, verification and business flags | Reels (use instagram.reels) |
One call gets you 50 reels' view counts. The other gets you everything about one reel. Use the first to pick candidates and the second only for the ones that matter.
What does one reel cost?
One instagram.reels call is 2 credits for up to 50 reels, so each reel's views, likes and comments cost 0.04 credits. That's about $0.00006 per reel at the Builder rate ($1.56 per 1k credits) and $0.000036 at Scale ($0.90 per 1k).
A full read with instagram.reel is 1 credit: $0.0016 at Builder, $0.0009 at Scale. The cheap number only covers what the Reels tab shows. Captions cost the full read.
How do I scrape an account's Reels tab?
Call POST /v1/instagram/reels with a username and an optional limit (default 12, max 50). It costs 2 credits whatever the limit, so ask for 50.
- Create an API key and export it as
SCRAPEEVERYTHING_API_KEY. - Send the username (an @handle or profile URL also works).
- Read
reelsin tab order, newest first. Pinned reels haveis_pinned: true. - Check
has_moreto see whether the tab holds more than you received.
curl -X POST https://api.scrapeeverything.com/v1/instagram/reels \
-H "Authorization: Bearer $SCRAPEEVERYTHING_API_KEY" \
-H "Content-Type: application/json" \
-d '{"username": "example_brand", "limit": 50}'Trimmed response (real shape, placeholder values):
{
"success": true,
"data": {
"id": "1234567890",
"username": "example_brand",
"follower_count": 48213,
"reels": [
{
"shortcode": "ABCdef12345",
"link": "https://www.instagram.com/reel/ABCdef12345/",
"owner_id": "1234567890",
"taken_at": 1792480000,
"like_count": 812,
"comment_count": 37,
"view_count": 21450,
"like_and_view_counts_disabled": false,
"is_pinned": false
}
],
"reels_fetched": 50,
"has_more": true
},
"meta": { "scraper": "instagram.reels", "cached": false, "credits_charged": 2 }
}Two details catch people out. The Reels tab also lists collab reels owned by another account; you spot them because owner_id differs from the top-level id. And taken_at is decoded from the media ID, so it usually lands a few minutes before the real publish time. Fine for "posts per week", wrong for "best time of day".
We drop collab reels by default. Most clients want the brand's own output.
The Instagram Reels scraper page has the full field list.
Can I get more than 50 reels from one account?
No. The logged-out Reels tab gives at most 50 per request, with no pagination past that. For history, pull the tab weekly and store every shortcode you see. A few months in, your record is longer than any single request returns.
How do I get one reel's caption, audio and MP4 link?
Call POST /v1/instagram/reel with a url or a bare shortcode. Reel, post and IGTV links work, so a /p/ link to a video post is fine. Photo and album posts return 404 with NOT_A_REEL. Cost: 1 credit.
curl -X POST https://api.scrapeeverything.com/v1/instagram/reel \
-H "Authorization: Bearer $SCRAPEEVERYTHING_API_KEY" \
-H "Content-Type: application/json" \
-d '{"shortcode": "ABCdef12345"}'The same call in Node 18+, no dependencies:
const res = await fetch("https://api.scrapeeverything.com/v1/instagram/reel", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SCRAPEEVERYTHING_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ shortcode: "ABCdef12345" }),
});
const body = await res.json();
if (!body.success) throw new Error(`${res.status} ${body.code}: ${body.message}`);
console.log(body.data.view_count, body.data.video_url_expires_at);{
"success": true,
"data": {
"shortcode": "ABCdef12345",
"owner_username": "example_brand",
"caption": "Placeholder caption for the example reel #examplebrand",
"like_count": 812,
"comment_count": 37,
"view_count": 21450,
"taken_at": 1792480312,
"duration_seconds": 18.4,
"has_audio": true,
"audio": {
"title": "Original audio",
"artist_name": null,
"artist_username": "example_brand",
"is_original": true
},
"video_url": "https://scontent.cdninstagram.com/...mp4?...",
"video_url_expires_at": "2026-10-24T09:12:00Z"
}
}Can I download the Instagram reel MP4 through the API?
Yes. video_url is a direct MP4 file, but it's a signed CDN link that stops working at video_url_expires_at, usually within a few days. Download it right away:
curl -L -o reel.mp4 "<video_url>"Don't store the URL for next month. Store the file, or the shortcode and fetch a fresh link later.
The audio object tells you whether the sound is licensed music (artist_name set) or original audio (is_original: true). Handy for seeing which brands ride trending tracks and which record their own voiceover.
How do I search Instagram reels by keyword?
Call POST /v1/instagram/reels_search with a query (1 to 100 characters). Optional: date_posted (last-week, last-month or last-year), page (1 to 10, about 10 reels each) and limit (how many of the page's reels to open, 1 to 10). It costs 3 credits.
Instagram's own search needs a login. So the endpoint searches DuckDuckGo's index (site:instagram.com/reel <query>), then opens each reel it finds on Instagram. What that means for you:
- Coverage, freshness and order follow the search engine. New reels show up late, and a popular reel isn't guaranteed to appear.
date_posteduses the date the search engine assigns, which is usually but not always the posting date.taken_athas the real one.- Reels are opened one by one, so a call can take 10 to 30 seconds. Set your timeout to match.
- A reel that couldn't be read stays in the list with
details_available: falseand the reason indetails_error. pageabove 1 gets blocked more often. A blocked search fails withTARGET_BLOCKEDand the credits are refunded.
It isn't a replacement for Instagram's in-app search. Better you hear that here than in a client demo.
Can I scrape reels by hashtag or by sound?
Not directly. There's no Instagram hashtag or audio endpoint in the catalog today. Keyword search is the closest option, since a reel's indexed page text often includes its hashtags. All Instagram endpoints are on the Instagram scraper API hub.
Example: how do I benchmark a brand's Reels performance?
Here's what we'd build for a quick competitor check. Pull the last 50 reels, take the median views (one viral reel wrecks an average), then open the top 5 to read captions and audio. A caption's first line is a fair proxy for the hook. It isn't the spoken hook, so treat it as a lead.
import os
import re
import statistics
import requests
API = "https://api.scrapeeverything.com/v1/instagram"
HEADERS = {"Authorization": f"Bearer {os.environ['SCRAPEEVERYTHING_API_KEY']}"}
def call(action, body, timeout=60):
r = requests.post(f"{API}/{action}", json=body, headers=HEADERS, timeout=timeout)
payload = r.json()
if not payload.get("success"):
raise RuntimeError(f"{r.status_code} {payload.get('code')}: {payload.get('message')}")
return payload["data"]
def first_line(caption):
# captions are whitespace-collapsed: cut at the first sentence end or hashtag
return re.split(r"(?<=[.!?])\s+|\s+#", caption or "", maxsplit=1)[0][:120]
def benchmark(username, top_n=5):
tab = call("reels", {"username": username, "limit": 50, "cache_days": 1}) # 2 credits
own = [
r for r in tab["reels"]
if r["owner_id"] == tab["id"] # drop collab reels
and not r["like_and_view_counts_disabled"]
and r["view_count"] is not None
]
views = [r["view_count"] for r in own]
top = sorted(own, key=lambda r: r["view_count"], reverse=True)[:top_n]
hooks = []
for r in top: # 1 credit each
try:
reel = call("reel", {"shortcode": r["shortcode"], "cache_days": 7})
except RuntimeError as err:
print("skipping", r["shortcode"], err)
continue
audio = reel["audio"]["title"] if reel["audio"] else None
hooks.append((reel["view_count"], reel["duration_seconds"], audio, first_line(reel["caption"])))
return {
"username": tab["username"],
"followers": tab["follower_count"],
"reels_counted": len(views),
"median_views": statistics.median(views) if views else None,
"top_hooks": hooks,
}
print(benchmark("example_brand"))Why it looks like this:
- Captions come back whitespace-collapsed, so
splitlines()would return the whole thing. Splitting on the first sentence end or the first#gets the opening line. call()raises with the API's stablecode, so a dead target shows up asNOT_FOUNDorPRIVATE_ACCOUNT, not a bare 404. Forreels_search, passtimeout=90.cache_daysmakes repeat runs free: cache hits cost 0 credits, with a window of 1 to 14 days (caching docs). Captions barely change, so 7 days. View counts move, so the tab gets 1.- Reels with hidden counts are dropped. Their numbers would drag the median toward zero.
statistics.median is from the Python standard library statistics module, so no pandas. follower_count is already in the tab response for follower-normalized views. Call instagram.profile (1 credit) only if you want bio or post counts too. The agencies use case shows the same key covering TikTok and YouTube for a client roster.
How much does an Instagram Reels pipeline cost?
Credits come in one-time packs that never expire. Failed requests are refunded automatically and cache hits are free.
| Pack | Price | Credits | Per 1k credits |
|---|---|---|---|
| Builder | $39 | 25,000 | $1.56 |
| Growth | $119 | 100,000 | $1.19 |
| Scale | $449 | 500,000 | $0.90 |
The benchmark costs 7 credits per brand per run: 2 for the tab, 5 for the top reels.
| Plan | Credits per run | Runs | Total credits | At Builder rate |
|---|---|---|---|---|
| 1 brand, weekly, 4 weeks | 7 | 4 | 28 | $0.04 |
| 20 competitors, weekly, 4 weeks | 140 | 4 | 560 | $0.87 |
| 20 keywords, 1 search page each, daily for 30 days | 60 | 30 | 1,800 | $2.81 |
List costs, before caching and refunds. Real spend lands at or below them unless you keep retrying dead targets. The pricing calculator does the same math per endpoint.
Which errors are billed?
A 404 that is a final answer is billed, because the lookup completed. Retrying it charges again, so take dead or private targets off your list.
| Code | HTTP | Charged? | What to do |
|---|---|---|---|
NOT_FOUND | 404 | Yes | Doesn't exist. Remove it. |
PRIVATE_ACCOUNT | 404 | Yes | Not public. Remove it. |
AGE_RESTRICTED | 404 | Yes | Needs an age-verified login. Remove it. |
RATE_LIMITED | 429 | No | Wait for RateLimit-Reset, then retry. |
TARGET_BLOCKED | 502 | No, refunded | Retry later. |
TIMEOUT | 504 | No, refunded | Retry with a longer client timeout. |
NOT_A_REEL and LOGIN_REQUIRED also return 404. Every response carries meta.credits_charged, so you always see what a call cost. Details are in the errors docs and rate limits docs.
What does Instagram hide from logged-out visitors?
Know the limits before you promise a client a dashboard:
view_countcan benullwhen Instagram doesn't show plays to logged-out visitors.- Private, age-restricted and login-walled accounts return
404withPRIVATE_ACCOUNT,AGE_RESTRICTEDorLOGIN_REQUIRED. Public data only. - No insights. Reach, saves, shares, watch time and demographics belong to the account owner. For your own accounts, use Meta's Instagram Platform documentation.
Is scraping Instagram Reels legal?
It depends on what you collect and how, and this isn't legal advice. In Meta Platforms, Inc. v. Bright Data Ltd. (N.D. Cal. 2024, docket on CourtListener), the court found Meta's terms did not prohibit Bright Data's logged-out scraping of public data, on those specific terms and facts. Public data can still be personal data, so the GDPR and similar laws apply to individuals' captions or usernames you store. Our post on whether scraping public social media data is legal covers the cases, and the best Instagram scraper APIs in 2026 roundup compares providers.
Can I call the Reels scraper from Claude, n8n or a CLI?
Yes. Same endpoints, different front doors:
- MCP server:
@scrapeeverything/mcp, built on the Model Context Protocol and listed in the official MCP Registry. Setup is in the MCP integration guide. - CLI:
npx scrapeeverything. - n8n: the
n8n-nodes-scrapeeverythingnode. - OpenAPI: the spec at https://scrapeeverything.com/openapi.json, for generating a client.
Every Instagram endpoint's parameters are in the Instagram endpoint docs.
FAQ
Can I get more than 50 reels from one account?
Not in one request. The public Reels tab returns up to 50 reels for 2 credits (default 12), and has_more says whether more exist. For longer history, pull the tab on a schedule and keep the shortcodes yourself.
Why does the Reels tab response have no captions?
Instagram's logged-out Reels tab doesn't include captions, exact publish times, durations or video URLs. Call instagram.reel with the shortcode (1 credit) to get them.
How long does the reel MP4 link work?
Until video_url_expires_at, usually a few days. It's a signed CDN link, so download the file before then.
Does keyword search use Instagram's own search?
No. Instagram's search needs a login, so instagram.reels_search finds reels through DuckDuckGo's index and opens each one on Instagram. New reels appear with a delay.
Is scraping Instagram Reels legal?
Logged-out public data is on firmer ground than data behind a login (Meta v. Bright Data, N.D. Cal. 2024), but privacy law still applies to personal data. Not legal advice.
What happens to my credits if a request fails?
Failed requests are refunded automatically, including TARGET_BLOCKED and TIMEOUT. A 404 that is a final answer, like a deleted reel or a private account, is billed, since the lookup completed.
Try it on a competitor
Get 100 free credits. No payment details needed, just sign in with Google or GitHub. At 7 credits per brand, that runs the benchmark above on 14 brands.