Instagram Profile & Posts Scraper
Pricing
from $0.01 / 1,000 results
Instagram Profile & Posts Scraper
Scrape public Instagram profiles and their recent posts with no login: followers, following, post count, bio, links, verified flag, and up to 12 recent posts with captions, media and dates. Likes and comments need your own session cookies. Pay per profile and per post.
Pricing
from $0.01 / 1,000 results
Rating
0.0
(0)
Developer
The Howlers
Maintained by CommunityActor stats
0
Bookmarked
92
Total users
3
Monthly active users
3 days ago
Last modified
Categories
Security
Limited permissionsShare
Instagram Scraper
Read public Instagram profiles without logging in: follower, following and post counts, name, bio, bio links, verified and private flags, and the latest posts Instagram shows logged-out visitors (up to 12, with caption, type, image and date). Add your own session cookies to read the logged-in page as well, for more posts and like counts.
Every value comes from the profile page Instagram served. A value Instagram did not show is null, never a guess.
How it reads profiles
Without cookies the actor visits each profile the way a logged-out visitor does, using the Camoufox stealth browser through Apify residential proxy. Instagram puts the profile's public data in the first HTML document of the page, so only that document is loaded (no images, videos or scripts), one profile at a time with a short pause between profiles. A proxy session (address plus Instagram's cookies) is reused across profiles and replaced when Instagram refuses a visit.
With sessionCookies (from your own Instagram account) the actor reads the logged-in profile page and opens the posts for likes and comments. A profile the logged-in session cannot read is then read as a logged-out visitor.
| Without cookies | With your session cookies | |
|---|---|---|
| Followers, following, post count | Yes | Yes |
| Name, bio, bio links, verified, private | Yes | Yes |
| Latest posts (caption, type, image, date) | Up to 12 | Up to maxPosts (50) |
| Likes and comments per post | No (null) | Yes |
Quick start
Real profiles, no login
{"demoMode": false,"usernames": ["natgeo", "nike"],"maxPosts": 6}
Sample output only
{"demoMode": true,"usernames": ["instagram"]}
Demo Mode returns one labeled sample profile (demo: true with a _notice) to show the output format, and charges no profile or post events. It is on by default so a first run costs nothing; set it to false for real data.
Output
One row per profile that was read:
{"username": "beyondwowplumbing","fullName": "Beyond Wow Plumbing","biography": "Austin-area plumbing experts\nFamily-owned since 1980\n...","profilePicUrl": "https://scontent...","followersCount": 1021,"followingCount": 307,"postsCount": 1123,"isVerified": false,"isPrivate": false,"isBusinessAccount": null,"externalUrl": "https://linktr.ee/beyondwowplumbing","bioLinks": ["https://linktr.ee/beyondwowplumbing"],"linkedFacebookPage": { "name": "Beyond Wow Plumbing", "id": "206981846005241" },"countsRounded": false,"dataSource": "public_profile","profileUrl": "https://www.instagram.com/beyondwowplumbing/","latestPosts": [{"id": "4021627416677606383","shortcode": "DfPsNP2CmPv","url": "https://www.instagram.com/p/DfPsNP2CmPv/","type": "carousel","caption": "Skipping maintenance might feel harmless now...","displayUrl": "https://scontent...","likesCount": null,"commentsCount": null,"timestamp": "2026-11-02T16:02:48.901Z","isVideo": false,"hook": "Skipping maintenance might feel harmless now... until your plumbing decides otherwise.","hookWordCount": 11,"hasQuestion": false,"hasCTA": true}],"scrapedAt": "2026-11-03T15:30:00.000Z"}
| Field | Meaning |
|---|---|
followersCount, followingCount | From the profile record on the page |
postsCount | From the page summary Instagram publishes ("1,123 Posts"). countsRounded is true if a count was only shown abbreviated, such as "12.5K" |
latestPosts | Newest first. Without cookies: the posts Instagram shows logged-out visitors (up to 12). timestamp is the post's creation time, which Instagram encodes in the post id and also prints in the post's description |
likesCount, commentsCount | null when not shown (logged-out visitors do not see them) |
isBusinessAccount | null when the page did not say |
dataSource | public_profile (logged out), logged_in_session (your cookies) or firecrawl |
Profiles that could not be read are listed in the OUTPUT record of the key-value store under notScraped, with a status (not_found, blocked, invalid, error) and a message. They are not charged.
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
usernames | array | - | Usernames to read, with or without @, or profile URLs |
maxPosts | integer | 12 | Recent posts per profile (0 to 50; at most 12 without cookies). 0 returns the profile only, with no posts |
includeReels | boolean | true | Include reels among the recent posts |
includeComments | boolean | false | Comments are not read in real runs yet (Instagram shows them only to logged-in visitors); Demo Mode samples show the format |
maxCommentsPerPost | integer | 20 | Comments per post |
includeReactions | boolean | false | Detailed engagement metrics; shown in Demo Mode samples only for now |
demoMode | boolean | true | Return one labeled sample profile instead of reading Instagram |
sessionCookies | string | - | Optional. Your Instagram cookies as a JSON array (Cookie-Editor export), for the logged-in page |
cookieStorageKey | string | - | Instead of sessionCookies: load cookies saved by the Cookie Manager actor |
cookieKvStoreName | string | - | Name or ID of the key-value store where Cookie Manager saved your session (its default is cookie-sessions) |
useFirecrawl | boolean | false | Read profiles through the Firecrawl API instead (needs firecrawlApiKey) |
firecrawlApiKey | string | - | Your Firecrawl API key |
proxy | object | Apify residential | Proxy settings. Leave empty to read public profiles through Apify residential proxy; with session cookies the logged-in page uses a proxy only when one is set here |
webhookUrl | string | - | URL to POST results to (Zapier, Make, n8n) |
enableSentimentAnalysis | boolean | false | AI sentiment; shown in Demo Mode samples only for now |
aiProvider | string | "none" | AI provider for sentiment analysis |
aiApiKey | string | - | API key for that provider |
aiModel | string | - | Custom model name (leave empty for the default) |
Pricing
This actor uses pay-per-event billing:
| Event | When it is charged | Price |
|---|---|---|
| Actor start | Once when the run starts, one event per GB of memory (minimum one). At the default 4 GB of memory a run starts at $0.40 | $0.10 per GB |
| Profile Scraped | Per profile scraped | $0.02 |
| Post Scraped | Per post scraped | $0.01 |
| Result | Each item written to the default dataset | $0.00001 |
Profile Scraped is charged once per profile row whose counts were read, right after the row is saved. Post Scraped is charged once per post in that row's latestPosts, so maxPosts sets the most a profile can cost. With maxPosts set to 0 a profile returns no posts and costs one Profile Scraped only. Profiles that were not found or could not be read are not charged. Public profile reading needs little memory, so a run with 2 GB starts at $0.20. Demo Mode charges no profile or post events.
Troubleshooting
A profile is in notScraped with not_found
Instagram showed "Sorry, this page isn't available" on three visits from different addresses. The username is wrong, the account was renamed or deleted, or it is restricted (for example by age).
blocked
Instagram refused the visits (login page or HTTP 429) from every address tried. Run again later, or add your own session cookies.
latestPosts is empty
The account is private (isPrivate: true) or has no posts.
Likes are null
Logged-out visitors do not see like or comment counts. Add sessionCookies from your own account for them.
Built by John Rippy | Actor Arsenal