Instagram Profile, Posts & Reels Scraper avatar

Instagram Profile, Posts & Reels Scraper

Pricing

from $1.50 / 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.50 / 1,000 scraped records

Rating

0.0

(0)

Developer

Hamza

Hamza

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Turn any public Instagram handle into clean, structured data. Give it a list of usernames and get back full profile stats plus every post 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 is complete and typed instead of scraped-from-HTML guesswork.


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 plus its Reels tab, with play counts and audio attribution.

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": 34.004,
"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…",
"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 timeline and Reels posts. Single posts fetched by URL come from an endpoint with no view count, so it is null there.
  • 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.

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.