Instagram Profile, Posts & Reels Scraper avatar

Instagram Profile, Posts & Reels Scraper

Pricing

from $1.00 / 1,000 scraped records

Go to Apify Store
Instagram Profile, Posts & Reels Scraper

Instagram Profile, Posts & Reels Scraper

Scrape public Instagram profiles, posts and reels — no cookies, nothing to configure. Get followers, bio and links, plus every post's likes, comments, plays, caption, hashtags and direct image/video URLs. Add top comments, filter by date or media type, or pull single posts and reels by URL.

Pricing

from $1.00 / 1,000 scraped records

Rating

0.0

(0)

Developer

Hamza

Hamza

Maintained by Community

Actor stats

0

Bookmarked

86

Total users

26

Monthly active users

8 days ago

Last modified

Security

Limited permissions

Share

Turn any public Instagram handle into clean, structured data. Give it a list of usernames and get back available profile stats plus posts with likes, comments, plays, captions, hashtags, timestamps and direct media URLs — no login, no cookies, no browser automation, nothing to configure.

Built on Instagram's own JSON endpoints rather than by parsing the page, so the output uses typed source fields instead of scraped-from-HTML guesswork. Availability depends on what Instagram exposes on the selected route.


What it does

Point it at profiles, at individual post URLs, or both.

Per profile, choose one of three modes:

ModeWhat you get
Profile detailsThe profile record only — fast and cheap for bulk audits.
Posts (default)The profile plus its timeline, paged back through history.
ReelsThe profile's reels, newest first — the timeline walked and filtered to clips.

Also supported:

  • Single posts and reels by URL — paste any /p/… or /reel/… link.
  • Top comments per post — comment text, author, likes, replies and timestamp.
  • Filters — cap posts per profile, only posts newer than a date, and filter by media type (image / video / carousel / reel).

What people use it for

  • Influencer vetting — real follower counts, engagement rates and posting cadence before you pay a creator.
  • Competitor tracking — what rivals post, how often, and what actually lands.
  • Campaign and UGC reporting — pull the exact posts in a campaign and their performance.
  • Content research — find the top-performing formats and hooks in a niche.
  • Audience sentiment — read what commenters actually say under a post.
  • Media archiving — direct image and video URLs for every post.

What you get

Three record types land in one dataset, each tagged with a type field so you can filter or split them. All examples below are real output, abridged.

type: "profile"

{
"type": "profile",
"username": "nasa",
"userId": "528817151",
"fullName": "NASA",
"profileUrl": "https://www.instagram.com/nasa/",
"biography": "Making the seemingly impossible, possible. ✨",
"externalUrl": "https://www.nasa.gov/",
"bioLinks": [
{ "title": "Download the NASA App", "url": "https://www.nasa.gov/nasa-app/", "linkType": "external" },
{ "title": "Artemis III", "url": "https://www.nasa.gov/mission/artemis-iii/", "linkType": "external" }
],
"followersCount": 104292683,
"followingCount": 91,
"postsCount": 4859,
"reelsCount": 171,
"highlightsCount": 5,
"isVerified": true,
"isPrivate": false,
"isBusinessAccount": true,
"businessCategoryName": "Government Agencies",
"relatedProfiles": [{ "username": "cosmic.travelerr", "fullName": "CosmicTraveler", "isVerified": true }],
"profilePicUrl": "https://instagram.f…fbcdn.net/v/t51.2885-19/29090066_…jpg"
}

type: "post"

{
"type": "post",
"id": "3948507321457537241",
"shortcode": "DbL6n0ggXDZ",
"url": "https://www.instagram.com/reel/DbL6n0ggXDZ/",
"ownerUsername": "nasa",
"ownerFullName": "NASA",
"ownerIsVerified": true,
"caption": "Sound on!\n\nSonifications take images from across the universe and turn them into music…",
"hashtags": ["NASA", "Space", "MusicLife"],
"mentions": ["nasachandraxray"],
"mediaType": "reel",
"productType": "clips",
"takenAt": "2026-07-24T18:46:42.000Z",
"takenAtTimestamp": 1784918802,
"likesCount": 429292,
"commentsCount": 1947,
"playsCount": 11371177,
"videoDuration": null,
"countsHidden": false,
"commentsDisabled": false,
"isSponsored": false,
"displayUrl": "https://instagram.f…fbcdn.net/v/t51.82787-15/753557824_…jpg",
"imageUrls": ["…"],
"videoUrls": ["…"],
"width": 1080,
"height": 1920,
"source": "profile-feed",
"commentsScraped": 0
}

type: "comment"

{
"type": "comment",
"id": "17873383008553356",
"postShortcode": "DbL6n0ggXDZ",
"postUrl": "https://www.instagram.com/reel/DbL6n0ggXDZ/",
"postOwnerUsername": "nasa",
"text": "95% of the universe is stuff we still can't directly see or explain…",
"commentType": "text",
"createdAt": "2026-07-27T00:24:15.000Z",
"likesCount": 0,
"repliesCount": 0,
"username": "3xsaintcom",
"userIsVerified": false
}

Input reference

FieldTypeDefaultWhat it does
Instagram profileslist["nasa"]Usernames, @handles or profile URLs — all three forms work.
What to get for each profileselectpostsdetails, posts or reels.
Single post or reel URLslistemptyAny /p/… or /reel/… link. Works with or without profiles.
Save the profile recordbooleantrueTurn off to get posts only.
Max posts per profileinteger30Your per-profile cap.
Only posts newer thandateemptySkip anything older.
Post typeselectallall, image, video, carousel or reel.
Also scrape top commentsbooleanfalseAdds comment records under each post.
Max comments per postinteger15Lowers the ceiling; see limits below.
Parallel profilesinteger3How many profiles to work on at once.
CountrystringusProxy country for the requests.

Nothing is required — the defaults run out of the box.


Pricing: pay per event

You are charged for two things, and they add together.

EventFires
Dataset itemOnce per record saved — every profile, every post, and every comment.
post-commentsOnce per post whose comments were fetched as a separate request and came back with at least one comment.

What that means in practice

Scraping one post with comments turned on and 10 comments returned costs:

  • 1 dataset item for the post row
  • 10 dataset items for the 10 comment rows
  • 1 × post-comments for the enrichment

So post-comments is on top of the dataset items, not instead of them. It is a per-post fee for the extra round-trip Instagram requires to read comments.

You are not charged post-comments when:

  • Comments are off — the default. Then you only pay dataset items.
  • The post came from a single post URL. That route returns the post and its comments in one response, so there is no extra request to bill.
  • Instagram returned no comments for the post, or the comment request failed. The request still happened; you are billed only for comments you actually get.

Rough guide: a 30-post profile with the profile record and comments off is 31 dataset items. The same run with comments on and ~15 comments per post is about 481 dataset items plus 30 post-comments.

To keep costs predictable, leave comments off unless you need the text, and use Max posts per profile as your budget dial.


Limits — please read before buying

Everything here was measured against the live site, not assumed.

Private accounts

A private profile returns its real follower and post counts but zero posts. You get the profile record and a warning. There is no logged-out way around this.

Rate limiting is the real ceiling

Instagram meters requests per IP and per URL path. In testing, roughly 35 requests to the post endpoint from one IP over 30 minutes triggered a 401 "Please wait a few minutes" that had not cleared 25 minutes later.

Single posts have their own fallback: if the full post route is unavailable, the actor reads the public embed endpoint. That record is marked source: "oembed-partial" and has the caption, author and thumbnail but no likes, comments or timestamp.

Practical advice: prefer several smaller runs over one enormous one. Very deep crawls across many profiles will be slower than the item count suggests.

Comments cap at ~15 per post

Instagram returns only the top ~13–15 comments to logged-out clients. The response advertises a next-page cursor, but no logged-out query accepting it exists, so deeper comment paging is not available at any price. maxCommentsPerPost can lower that ceiling, never raise it. commentsCount on the post is the true total; commentsScraped is how many were saved.

Other things worth knowing

  • Page size is fixed at 12. Instagram ignores a count parameter, so 100 posts is always at least 9 requests.
  • A post-type filter costs extra requests. It is applied after each page, so asking for 30 reels from a photo-heavy account pages through hundreds of posts. Filtered runs get up to 60 extra pages, then stop — a very rare media type may return fewer rows than your cap.
  • Media URLs expire. imageUrls and videoUrls are signed CDN links that need no auth but go stale within hours. Download at scrape time; don't store the URLs.
  • Play counts depend on route. playsCount is present on the newest posts of a timeline walk. Single posts fetched by URL come from an endpoint with no view count, so it is null there.
  • Video length is not served. Instagram's current post routes no longer include a duration anywhere this actor reads (verified 2026-11-01), so videoDuration is null even on reels.
  • Some comments have no text. Instagram also serves non-text comments (GIF-only replies from the mobile apps). They arrive without a text field; when the response marks the variant, the record is labelled commentType: "gif" with text "[GIF]". Unmarked non-text comments keep text: null and commentType: null rather than a guessed value. Plain text comments are commentType: "text".
  • Older posts are thin unless comments are on. In current testing, Instagram's paged timeline route serves posts past the newest ~12 without engagement, timestamps or the full media ladder. When Also scrape top comments is on, the comment request already visits every post and restores all of those fields at no extra cost. With comments off, likesCount, commentsCount, takenAt, videoUrl and the media ladders come back null for those older posts — captions, shortcodes, media type, cover image and owner are always present.
  • Reels mode covers the timeline, not a separate tab. There is no logged-out route to the reels tab in current testing, so reels mode walks the timeline and keeps the clips. A very photo-heavy account can exhaust the extra page allowance before every historical reel is seen — the run keeps what it found and the log says where it stopped.
  • Hidden engagement stays null, not zero. When a creator hides like counts, likesCount is null and countsHidden is true — so your averages aren't silently dragged down by fake zeros.
  • Some fields are route-specific. taggedUsers, accessibilityCaption and topics are only present on posts fetched by URL, not from the timeline. musicTitle / musicArtist appear only when a reel uses licensed audio.

Access and partial results

The actor tries a public HTTPS transport first for profile reads. If that route is blocked, it uses the configured scraping gateway. Timeline paging runs through Instagram's logged-out posts-tab query with its tokens refreshed automatically. Login pages, empty profile responses and gateway failures are never saved as data.

Instagram can block any route without notice, and its servers intermittently reject individual requests with a generic error page. Every request class retries on a fresh route before giving up: profile and single-post reads retry on fresh exit IPs, and the timeline and comment queries refresh their access tokens before retrying. When the main route is blocked, GET requests also try an alternate access route through the gateway before failing. A request that still fails after its retries is reported in the log with the reason.

Blocks often lift within minutes. Set "Keep retrying when blocked" above 0 and, when every route is failing, the scraper waits and probes about once every 20 seconds instead of finishing empty-handed — each probe is one provider request, so a 5-minute wait adds up to about 15 provider requests per blocked target and a run that starts in a bad window takes several minutes longer. The default is 0: give up after the normal retries, with no added requests or delay.

If pagination stops after some posts have been collected, those posts are kept and the log reports the shortfall. If the timeline route fails before producing posts, the actor keeps the posts embedded in the profile response instead; this preview can be smaller than your requested cap. Optional comments have their own endpoint and are not guaranteed by a successful profile/posts run.

A run never fails over your input. A misspelled username, a private profile, a deleted post or a dead link is skipped with a message that names the problem, and the run still ends Succeeded. If every target is unavailable — or Instagram blocks every route before anything can be collected — the run also ends Succeeded with a status message that says plainly that nothing was collected, so scheduled runs do not turn red over a temporary block. The run only fails when the scraper's own setup is broken, and the message says so.

FAQ

Do I need an Instagram account, cookies or a session? No. Nothing to log in with, nothing to paste, nothing to configure.

Can it scrape private accounts? No. You get the profile's public counts and no posts.

Does it return video files? It returns direct video and image URLs. They expire within hours, so download at scrape time.

How do I keep profiles, posts and comments apart? Filter on the type field: profile, post or comment. Every comment also carries postShortcode and postUrl so you can join it back to its post.

Why did I get fewer posts than I asked for? Either the profile has fewer, your date or post-type filter excluded them, or a rate limit stopped the walk part-way — in which case everything fetched before the block is still saved, and the log says how many pages went through.

Is scraping Instagram legal? This actor reads only public data that any logged-out visitor can see. You are responsible for how you use it — in particular for GDPR/CCPA obligations when the data includes personal information, and for Instagram's own terms. Do not use it to build profiles of private individuals.