Instagram Reels Scraper | Reels by Username | No Login avatar

Instagram Reels Scraper | Reels by Username | No Login

Pricing

from $5.00 / 1,000 actor starteds

Go to Apify Store
Instagram Reels Scraper | Reels by Username | No Login

Instagram Reels Scraper | Reels by Username | No Login

Recent Instagram Reels by username - caption, thumbnail, shortcode/URL, pinned status. No login, no browser. Optional detail mode adds likes/comments/date.

Pricing

from $5.00 / 1,000 actor starteds

Rating

0.0

(0)

Developer

Hriday Rungta

Hriday Rungta

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Instagram Content Scraper | Posts & Reels by Username

Extracts an Instagram account's recent posts and Reels from that account's own public, logged-out profile page. No login, no browser, no per-post request — one page fetch per username returns the whole recent-content batch.

What you get

Per post/Reel: content type, caption, media type (photo/video/carousel), pinned status, thumbnail URL, working shortcode and canonical instagram.com/p/... or instagram.com/reel/... URL.

What you do NOT get in this batch: like/comment counts and an exact timestamp. Instagram's own preview data for this page does not include them — see "How this works" below. If your use case needs exact counts, this Actor is honestly not the right fit; nothing here fakes them or leaves them out silently.

How this works (honestly)

A profile page fetched with a Googlebot user-agent gets Instagram's SEO-rendered HTML, which embeds a polaris_timeline_connection block: the account's ~12 most recent posts and Reels together, newest first. This Actor reads that block directly — the same page the sibling instagram-profile-scraper in this account already fetches for bio fields, just parsed further.

A normal browser identity is blocked cold, and so is Apify's own datacenter proxy — measured directly on Apify's infrastructure: both return an empty page or get rate-limited. Only Apify Proxy's UNBLOCKER group gets through. This is why the input's proxy configuration defaults to UNBLOCKER and isn't meant to be turned off — turning it off will not save you money, it will make every run return nothing.

This dependency is real, and it can change. This Actor's economics assume Instagram keeps serving this preview data to a Googlebot-identified, Unblocker-proxied request, and that Apify's UNBLOCKER pricing (currently ~$0.0015/request) stays roughly where it is. Neither is contractually guaranteed. If Instagram changes what it serves or Apify repriced Unblocker significantly, this Actor's output or margin would change with it — this README will be updated the day that's confirmed, not left stale.

One more real-world wrinkle, also measured live: which exact data block Instagram serves for the same URL is not perfectly consistent even from request to request. Occasionally the clean per-account batch is replaced by a different, "related content" block that mixes in posts from other tagged/co-authored accounts. When that happens, this Actor only keeps the items actually attributed to the username you asked for — it will never report someone else's post under your username, even if that means a smaller batch for that run.

Shortcodes are recovered without an extra request. Instagram derives a media's shortcode from its numeric ID with a public, well-documented, deterministic base64-style encoding. This Actor uses that instead of paying for a second fetch per item.

What was tried and dropped

  • Hashtag pages (/explore/tags/{tag}/) were tested the same way — Googlebot UA, then a real Apify-hosted run through UNBLOCKER proxy. Both failed: a redirect to Instagram's login wall without a proxy, and an HTTP 502 through UNBLOCKER. This looks like a hard login gate, not the kind of block Unblocker clears, so hashtag search is not shipped rather than shipped broken.
  • Full per-post detail by URL (exact like/comment counts, exact timestamp) works technically — individual post/Reel pages carry it — but costs one full Unblocker-proxied request per item. At that cost, pricing it at or below the cheapest real competitor's per-item rate for that tier would risk losing money on a realistic run. It is not shipped as a paid mode.
  • Comments were not attempted for the same reason, one level further down.

Incremental mode

Set mode: "changes". Instagram's preview batch carries no timestamp, so this Actor tracks a high-water mark on the numeric post ID (pk) instead — verified live to be strictly newest-first across the whole batch, including pinned posts sitting in their real chronological slot. Every run after the first returns only items newer than the last one it actually saved, per username.

Input at a glance

FieldDescription
usernamesRequired. One or more usernames, @handles, or profile URLs.
includePosts / includeReelsWhich content types to keep from each batch. Both default true.
mode"latest" (default, every run) or "changes" (incremental).
maxItemsBudget cap on billed rows for this run.
proxyConfigurationDefaults to Apify Proxy, UNBLOCKER group. Leave this as-is — see above.

Billing (pay-per-event)

EventPrice
Actor started$0.005 — charged once per run, regardless of results. Sized to cover a tiny run (e.g. one private/nonexistent account) on its own.
Post scraped$0.00045
Reel scraped$0.00048

For scale: a real 8-account test run during development (7 real, active accounts + 1 that doesn't exist) returned 83 rows from 8 requests — about 10-12 items per successful account, matching the ~12-per-page batch this pricing is built around.