Instagram Profile & Posts Scraper avatar

Instagram Profile & Posts Scraper

Pricing

from $1.50 / 1,000 results

Go to Apify Store
Instagram Profile & Posts Scraper

Instagram Profile & Posts Scraper

Scrape posts and profile details from any Instagram profile: captions, hashtags, likes, comments, video plays, image and video URLs, tagged users and more. No login or cookies needed. Export to JSON, CSV or Excel, or use via API. Pay only for results.

Pricing

from $1.50 / 1,000 results

Rating

0.0

(0)

Developer

Arishma

Arishma

Maintained by Community

Actor stats

0

Bookmarked

6

Total users

3

Monthly active users

14 hours ago

Last modified

Categories

Share

What does Instagram Profile & Posts Scraper do?

Instagram Profile & Posts Scraper extracts posts and profile details from any public Instagram profile, with no Instagram login and no cookies needed. Give it one or many usernames or profile URLs and get back clean, structured data for every post: caption, hashtags, mentions, likes, comments, video plays, image and video URLs, carousel items, tagged users, collaborators, location and publication date.

Use it to:

  • Monitor competitors and brands: track what they post, how often, and how their content performs.
  • Measure influencer engagement before a partnership: likes, comments and video plays per post.
  • Research content and hashtags: find out what formats (reels, carousels, images) work in your niche.
  • Feed dashboards, CRMs and AI pipelines with fresh Instagram data on a schedule.

What data can I extract from Instagram?

Post dataProfile data
Post URL, shortcode and IDUsername, full name and user ID
Caption, hashtags and mentionsBiography and bio links
Publication date and timeFollowers and following counts
Likes and comments count, latest commentsVerified and private status
Video play and view counts, durationProfile picture URL (standard and HD)
Image URL, video URL and carousel itemsNumber of posts and story highlights
Content type (image, video/reel, carousel)Business account flag and category
Pinned, paid-partnership and comments-disabled flagsExternal URL and Facebook ID
Tagged users, collaborators and location
Reel audio: music or original sound, audio URL
Image alt text

How do I scrape Instagram posts?

  1. Click Try for free.
  2. Enter one or more profile URLs or usernames, for example https://www.instagram.com/nasa/ or nasa.
  3. Keep the default Apify residential proxy, or under Proxy configuration choose Own proxies and enter your proxy URL.
  4. Set Max posts per profile, and optionally a date in Only posts newer than (such as 7 days or 2025-01-31).
  5. Click Start and download your data as JSON, CSV, Excel or HTML, or get it through the API.

How much does it cost to scrape Instagram?

You pay $1.50 per 1,000 posts; platform usage is included. With the default Apify residential proxy, proxy traffic is billed at cost: $0.008 per MB, in 100 KB steps (a typical profile uses well under 1 MB). Use your own proxy and there is no traffic charge. In profile-only mode you pay $1.60 per 1,000 profiles. Profiles that can't be scraped (missing, blocked, or private when you ask for posts) are not charged.

For example, 100 posts from each of 10 profiles costs 1,000 × $0.0015 = $1.50.

To control costs, set Max posts per profile and Only posts newer than, or set a maximum cost per run in the run options. The scraper stops as soon as that limit is reached.

Input

The input is the same as Apify's Instagram Scraper (posts) and Instagram Profile Scraper (profile details), so existing integrations work by changing only the Actor ID.

FieldDescription
directUrlsProfile URLs or usernames (nasa, @nasa, share links like nasa?igsh=...).
usernamesSame, in Instagram Profile Scraper's format. With includeAboutSection and no directUrls, returns profile details only.
resultsTypeposts (default) or details (one item per profile with its 12 latest posts).
onlyPostsNewerThanOnly posts published after this date. Absolute (2025-01-31) or relative (7 days, 2 weeks, 3 months).
resultsLimitMaximum number of posts per profile (default 50, or 1,000 when onlyPostsNewerThan is set).
skipPinnedPostsIgnore posts pinned to the top of the profile.
addParentDataAdd the owner's profile details to every post under metaData.
searchTypeOnly user is supported.
includeAboutSectionAccepted for compatibility; the about section needs a login and is not scraped.
outputFormatauto (default), default or apify. See Switching from Apify's Instagram scrapers.
proxyApify residential proxy by default ($0.008 per MB of traffic). To use your own (no traffic charge): { "useApifyProxy": false, "proxyUrls": ["http://user:password@host:port"] }.

Posts:

{
"directUrls": ["https://www.instagram.com/nasa/"],
"resultsType": "posts",
"searchType": "user",
"onlyPostsNewerThan": "14 days",
"addParentData": true,
"skipPinnedPosts": false,
"proxy": { "useApifyProxy": false, "proxyUrls": ["http://user:password@proxy.example.com:8000"] }
}

Profile details:

{
"usernames": ["nasa"],
"includeAboutSection": false,
"proxy": { "useApifyProxy": false, "proxyUrls": ["http://user:password@proxy.example.com:8000"] }
}

Output

Each post is one item in the dataset. Example (shortened):

{
"id": "3983374110243288826",
"shortCode": "DdHyaYAifb6",
"postUrl": "https://www.instagram.com/p/DdHyaYAifb6/",
"contentType": "carousel",
"productType": "carousel_container",
"text": "Cementing their names in history. The Artemis III crew is leaving their mark...",
"hashtags": [],
"mentions": ["NASAKennedy", "EuropeanSpaceAgency"],
"createdTime": "2026-09-10T21:20:24.000Z",
"likesCount": 119152,
"commentsCount": 880,
"videoPlayCount": null,
"videoDuration": null,
"imageUrl": "https://instagram.fbkk5-1.fna.fbcdn.net/v/t51.82787-15/805027638_...jpg",
"videoUrl": null,
"carouselItems": [
{ "id": "3983374043612570267", "contentType": "image", "imageUrl": "https://...jpg", "videoUrl": null }
],
"width": 1440,
"height": 1800,
"isPinned": true,
"isPaidPartnership": false,
"location": null,
"taggedUsers": [
{ "id": "549403870", "username": "nasakennedy", "fullName": "NASA's Kennedy Space Center", "isVerified": true }
],
"coauthors": [
{ "id": "549403870", "username": "nasakennedy", "fullName": "NASA's Kennedy Space Center", "isVerified": true }
],
"ownerId": "528817151",
"ownerUsername": "nasa",
"ownerFullName": "NASA",
"inputUsername": "nasa"
}

ownerUsername is the account that published the post. For collaboration posts this can be a different account than the profile you scraped, so use inputUsername to group posts by the profile you asked for.

With Add profile details to each post turned on, or in profile-only mode, the profile looks like this:

{
"userId": "528817151",
"username": "nasa",
"url": "https://www.instagram.com/nasa/",
"fullName": "NASA",
"biography": "Making the seemingly impossible, possible. ✨",
"externalUrls": [{ "title": "NASA.gov Homepage", "url": "https://www.nasa.gov" }],
"followersCount": 104282125,
"followsCount": 89,
"isVerified": true,
"isPrivate": false,
"profilePicUrl": "https://scontent.cdninstagram.com/v/t51.2885-19/...jpg",
"profilePicUrlHD": "https://scontent.cdninstagram.com/v/t51.2885-19/...jpg",
"highlightsCount": 5,
"postsCount": 4512,
"isBusinessAccount": true,
"businessCategoryName": "Government organization",
"externalUrl": "https://www.nasa.gov",
"fbid": "17841400008460056"
}

A summary of each run (which profiles succeeded, failed or were skipped, and why, plus the Apify Proxy traffic used) is saved as RUN_SUMMARY in the run's key-value store.

A run whose profiles are missing, private, restricted or mistyped still ends as succeeded, with the reasons in its status message and RUN_SUMMARY; it only fails when the scraper itself could not get through to Instagram. When Instagram stops answering partway through a profile's posts, the posts already scraped are kept and the profile counts as done.

Switching from Apify's Instagram scrapers

This Actor can replace apify/instagram-scraper (posts of a profile) and apify/instagram-profile-scraper without changes to your code: send the same input and you get the same output fields (url, timestamp, caption, displayUrl, childPosts, type, metaData, latestPosts, postsCount, ...).

  • Posts: the input of apify/instagram-scraper works as is: directUrls, resultsType: "posts", searchType: "user", onlyPostsNewerThan, skipPinnedPosts, addParentData (adds metaData to each post) and proxy (Apify residential by default, or your own proxyUrls).
  • Profiles: the input of apify/instagram-profile-scraper (usernames, includeAboutSection, proxy) returns one profile item per username, including latestPosts. resultsType: "details" or onlyProfileInfo: true does the same.
  • Errors: a profile that can't be scraped is written as { inputUrl, url, username, error, errorDescription } (error is not_found, private, restricted, invalid_input or failed), and is not charged.

The compatible format is chosen automatically when the input uses those Actors' fields; set outputFormat to apify or default to choose it yourself. Only profile scraping is supported: hashtag, place and comment searches, and the "about this account" add-on (includeAboutSection), are ignored with a warning.

Integrations and API

Run the scraper from your own code with the Apify API, or the JavaScript and Python clients. Schedule it to run daily or weekly, and connect the results to Google Sheets, Slack, Zapier, Make, Airbyte, webhooks and other integrations.

FAQ

Do I need an Instagram account or cookies?

No. The scraper only reads public data that Instagram shows to visitors who are not logged in, so your accounts are never at risk.

Can I use my own proxy?

Yes. The scraper uses Apify residential proxy by default, billed at $0.008 per MB of traffic. To use your own and skip that charge, select Own proxies and enter your proxy URLs. If a request fails 3 times on your own proxy (blocked, rate-limited, out of traffic), the scraper retries it up to 3 times on Apify residential proxy so the profile is still scraped; that traffic is charged at the same $0.008 per MB. Residential or mobile proxies from any provider work (Oxylabs, Bright Data, GoProxies, ...); Instagram blocks datacenter IPs quickly.

Can it scrape private profiles?

No. Private profiles are skipped, and they appear in the run summary as Profile is private. You can still get their basic profile details with Scrape profile details only.

Why do some results have likesCount: null?

The account has hidden like counts on that post.

Why are pinned posts older than my date filter?

Pinned posts always appear at the top of a profile. The date filter skips old pinned posts automatically. Turn on Skip pinned posts to ignore all pinned posts.

This scraper collects only publicly available data. However, results may contain personal data, which is protected by regulations such as the GDPR in the European Union. Do not scrape personal data unless you have a legitimate reason to. If you are unsure, consult a lawyer. You can also read the Apify blog post on the legality of web scraping.

Something does not work. What should I do?

Open an issue in the Issues tab. Include the run link and the profiles you tried, and we will look into it quickly.