Instagram Reels Scraper: Likes, Views, Comments & Followers
Pricing
from $0.40 / 1,000 results
Instagram Reels Scraper: Likes, Views, Comments & Followers
Scrape recent reels from public Instagram profiles to JSON: likes, views, comments, post date and URL per reel, plus follower, following and post counts. Add a date cutoff, or use enrich mode for photo and carousel posts with captions. No login; falls back to residential proxy when blocked.
Pricing
from $0.40 / 1,000 results
Rating
0.0
(0)
Developer
TicTech
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
20 days ago
Last modified
Categories
Features
Share
Scrape recent reels from public Instagram profile URLs into JSON: like, view/play and comment counts, shortcode and URL per reel, plus one profile row with follower, following and post counts. Bulk profile lists, no login. Blocked profiles are retried automatically on a fallback route.
What you put in: public profile URLs (e.g. https://www.instagram.com/ksi/). Direct /p/ and /reel/ URLs also work. No hashtag, place, or keyword search input — this Actor is for known profiles and posts.
Note: Only public profiles and posts. If a URL returns nothing (removed/renamed account, private account, login wall) you get one uncharged status row (
media_type: "error") with the reason, and the run still completes.
Why Use This Tool?
- Automate Instagram reporting: Replace manual screenshots with structured data.
- Bulk creator lists: Run dozens of profile URLs in a single Apify job.
- Profile + content together: Each profile URL scrapes profile metadata once (followers, following, post count) even when there are no new reels/posts in your date window.
- Stack-friendly output: Snake_case JSON for Sheets, warehouses, n8n/Make, or internal APIs.
- Lean by design: HTTP + TLS impersonation — no heavy browser farm; Apify Proxy handles anti-block.
Why Choose This Actor?
- Reels-focused: recent reels per profile with like, view/play and comment counts
- Always-on profile row:
media_type: "profile"so account metrics stay updated - Date filter (
until): Keep only content newer than a date for monthly monitoring - Soft-fail per URL: One blocked profile does not kill the bulk run, and you see why in a status row
- Apify-native: Console, schedules, webhooks, API, Make, n8n, Zapier
- PPE pricing: Predictable start + per-result billing
Features
- Scrape Instagram profile URLs and direct post/reel URLs
- Bulk
start_urlsin one run (deduped within a run, including after platform restarts) - Profile metadata scraped once per profile (followers, following, posts count, handle, display name)
- Reel fields: shortcode, URL, likes, views/plays, comments,
posted_at(from the media ID), author, handle, product type; caption when it appears in the profile grid.posted_atis filled for every reel;enrich_details: trueadds the exacttaken_attime, all captions, and photo/carousel posts with their counts - Optional
untildate filter (ISO /YYYY-MM-DD) - Apify Proxy by default with an automatic fallback: a blocked profile is retried on a fallback route, and after 2 blocks in a row the rest of the run uses that route; custom
proxyUrlsOK enrich_detailsoff by default — skips per-post page fetches; reels already carry likes/views/comments- Dataset export: JSON, CSV, Excel
Use Cases
- Brand & competitor monitoring on Instagram
- Influencer outreach — follower counts + recent reel performance
- Agency dashboards — scheduled Apify runs into Sheets / Looker
- Content archives for captions, URLs, and engagement history
- E‑commerce / DTC social proof and creator tracking
Input Example
{"start_urls": ["https://www.instagram.com/ksi/","https://www.instagram.com/reel/DdKDOY9iWFc/"],"max_items": 100,"until": "2026-09-01","enrich_details": false,"useResidential": false,"proxyConfiguration": {"useApifyProxy": true}}
| Field | What it does |
|---|---|
start_urls | Profile and/or /p/ · /reel/ URLs (required) |
max_items | Cap on dataset items (default 20; 0 = safe ceiling 5000). Free-tier tip: keep ≤ 100 |
until | Optional — keep reels/posts newer than this date (works without enrich_details; dates come from the media ID) |
enrich_details | Optional — fetch each post/reel page for exact date, caption, and grid photo/carousel posts with counts (default false) |
emit_status_rows | Default true — one uncharged media_type: "error" row per URL that returns nothing, with the reason |
useResidential | Default false — not needed for blocks: if a profile is blocked, it is retried on a fallback (residential) route, and after 2 blocks in a row the rest of the run uses that route. Set true to use it from the start for every profile |
proxyConfiguration | Default Apify Proxy with the automatic fallback. Custom proxyUrls OK (no automatic fallback) |
Output Examples
Profile metadata (one row per profile URL):
{"id": "1234567890","media_type": "profile","platform": "instagram","handle": "ksi","author": "KSI","url": "https://www.instagram.com/ksi/","follower_count": 9500000,"following_count": 400,"posts_count": 1200}
Reel / post metadata:
{"url": "https://www.instagram.com/reel/DdKDOY9iWFc/","caption": null,"posted_at": "2026-09-18T11:02:41Z","posted_at_source": "media_id","like_count": 29372,"view_count": 1325401,"play_count": 1325401,"comment_count": 144,"author": "ksi","handle": "ksi","media_type": "reel","platform": "instagram"}
Status row (not charged) for a URL with no data:
{"media_type": "error","input_url": "https://www.instagram.com/some.removed.account/","handle": "some.removed.account","error": "not_found","error_message": "Profile/post not available (removed, renamed, deactivated or never existed).","charged": false}
Output field notes
| Field | Meaning |
|---|---|
media_type | profile for the account row, reel for reels, image / carousel / video for grid posts (with enrich_details), error for uncharged status rows |
product_type | Instagram's own product label for the post when exposed (e.g. clips for reels) |
view_count / play_count | Video/reel views or plays as exposed by Instagram; null for photos or when not shown |
posted_at | Filled for every reel. posted_at_source is media_id (upload time from the Instagram media ID, usually within minutes) or taken_at (exact, with enrich_details) |
caption | Filled when the reel also appears in the profile grid; enrich_details fills the rest |
share_count | Always null: Instagram does not show share counts to logged-out visitors |
follower_count | Exact count from Instagram's page data. New or inactive accounts can really have 0 |
How to Run on Apify
- Open Instagram Scraper on Apify and click Try for free / Start.
- Paste public Instagram profile or post/reel URLs into start_urls.
- Set max_items (≤ 100 on free tier). Optionally set until.
- Keep Apify Proxy on. If a profile is blocked, the Actor retries it on a fallback route, and after 2 blocks in a row the rest of the run uses that route. Rotate/backoff is automatic on HTTP 429.
- Run and download the Dataset — profile row first, then reels, per profile. Check the run's status message for URLs with no data.
- Wire to schedules, webhooks, or Make / n8n / Zapier for recurring brand scrapes.
Run from your stack (API sketch)
curl -X POST "https://api.apify.com/v2/acts/tictechid~vanzi-instagram-scraper/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"start_urls":["https://www.instagram.com/ksi/"],"max_items":50,"proxyConfiguration":{"useApifyProxy":true}}'
Use the Actor id with a ~ in API paths: tictechid~vanzi-instagram-scraper.
Pricing
Pay-per-event (PPE):
actor-start— once per runresult— once per dataset item with data (including profile rows). Status rows (media_type: "error") and rows without any data are not charged. A run restarted by the platform is not charged a second start fee or for rows it already delivered
Current list price: $0.40 per 1,000 results plus $0.0005 per run start. Check Pricing on the Actor page for the live price.
Usage Limits
- Free tier: Run as often as you like within your monthly Apify free platform credit — there is no Actor-side run-count cap. Tip: free tier max items per run ≤ 100.
- Paid plans: Larger runs and higher volume, limited only by your Apify plan's credit and concurrency.
Need more credit or concurrency? See Apify Pricing.
FAQ
Do I need an Instagram login? No — public HTML only.
Do I need a residential proxy? No setting needed. If Instagram blocks a profile, the Actor retries it on a fallback (residential) route. After 2 blocks in a row, the rest of the run uses that route directly. If there is still nothing, you get a status row with the reason and the run finishes SUCCEEDED. Set useResidential to use the fallback route from the start. Custom proxyUrls are also supported.
Why was my run expensive? Per-post page fetches only happen with enrich_details: true, and until no longer needs them. Keep enrich_details off for routine monitoring.
What if there are no new reels this month? You still get the profile metadata row so follower/post counts update.
Empty dataset or missing profiles? Look at the status rows (media_type: "error") or FAILED_TARGETS in the run's key-value store. not_found means Instagram shows its "page isn't available" page for that handle (removed, renamed or deactivated: check the handle). blocked means a login wall or rate limit, so retry later. One bad URL won't fail the whole bulk run.
Why do some profiles show 0 followers? That is the number Instagram itself shows for that account (new or inactive accounts), not a parse error.
Support: Open an Issue on the Actor page or email contact@tictech.id.
For more details, contact the maintainer or email us at contact@tictech.id