Instagram Profile & Posts Scraper
Pricing
from $6.15 / 1,000 results
Instagram Profile & Posts Scraper
Scrape public Instagram profiles and posts by username, no login. Extract followers, following, bio, verified badge, business category, captions, likes, comments, video views and media URLs. Export to JSON, CSV or Excel.
Pricing
from $6.15 / 1,000 results
Rating
5.0
(1)
Developer
Scrapers Lat
Maintained by CommunityActor stats
0
Bookmarked
17
Total users
3
Monthly active users
21 hours ago
Last modified
Categories
Share
Instagram Profile & Posts Scraper
Here is one real result, with every field a post record returns:
{"imageUrl": "https://scontent-bos5-1.cdninstagram.com/v/t51.82787-15/773402982_19214295055020807_3804665531988145921_n.jpg","type": "post","username": "9gag","fullName": "9GAG: Go Fun The World","url": "https://www.instagram.com/p/DcAg2kDEa5m/","id": "3963312159132331622","shortcode": "DcAg2kDEa5m","ownerId": "259220806","followersCount": 52112356,"isVerified": true,"mediaType": "GraphImage","isVideo": false,"caption": "cause I don't wanna annoy my friends - #chatgpt #relationship #memes #9gag","accessibilityCaption": null,"likesCount": 21519,"commentsCount": 134,"commentsDisabled": false,"videoViewCount": null,"isPinned": false,"locationName": null,"width": 1080,"height": 1350,"videoUrl": null,"childImageUrls": [],"taggedUsers": [],"coauthors": [],"takenAt": "2026-08-14T05:01:38.000Z","productType": null,"isReel": null,"isCarousel": false,"childCount": null,"hasAudio": null,"thumbnailUrl": "https://scontent-bos5-1.cdninstagram.com/v/t51.82787-15/773402982_19214295055020807_3804665531988145921_n.jpg","hashtags": ["chatgpt", "relationship", "memes", "9gag"],"mentions": [],"locationId": null,"locationSlug": null,"musicArtist": null,"musicTitle": null,"musicUsesOriginalAudio": null,"musicAudioId": null,"likeAndViewCountsDisabled": false,"children": [],"observedAt": "2026-08-14T08:32:22.186Z","error": null,"aiSentiment": "neutral","aiSentimentScore": 0,"aiTopics": ["chatgpt", "relationship", "memes", "9gag"],"aiCategory": "comedy"}
The most complete no-login Instagram scraper available. It returns every field the public profile and post endpoints expose, plus parsed hashtags and mentions, per-slide carousel detail, related-profile discovery, and optional AI caption enrichment, and gives you six post filters to target exactly the posts you need.
📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples
Table of contents
- What it does
- Quickstart
- Input reference
- Output reference
- Example output record
- Run via API and CLI
- Fetch results
- Billing and limits
- FAQ and troubleshooting
What it does
The actor takes one or more public Instagram usernames, reads the public web profile for each, and writes one normalized record per result to the run's dataset. In Profile mode it returns one profile record per username. In Posts mode it returns one record per recent public post, each carrying its parent profile context (username, full name, follower count, verified flag).
It reads only the public data any logged-out visitor can see, so it never logs in and needs no cookies. Hashtags and mentions are parsed out of every caption and bio into clean arrays, carousels return per-slide detail, and the suggested accounts Instagram surfaces next to a profile are attached as relatedProfiles. Two optional paid AI add-ons classify each post caption's sentiment and topic/category.
Only public accounts are supported. Private accounts expose no public posts, so the actor returns an error record for them.
Quickstart
Open the actor, paste this into the input, and press Run. It returns up to 10 recent public posts from nasa with their captions, engagement counts and media URLs.
{"usernames": ["nasa"],"resultsType": "posts","postsLimit": 10,"maxRecords": 10}
usernames is the only required field. Set resultsType to profile for one profile record per username instead of posts. Every filter is optional; leaving them empty returns every recent post the profile exposes.
Input reference
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
usernames | string[] | yes | ["nasa"] | Public Instagram usernames to scrape, without the @. Only public accounts are supported. |
resultsType | enum | no | posts | profile returns one profile record per username. posts returns one record per recent public post with profile context. |
postsLimit | integer | no | 12 | Max recent posts per profile in Posts mode. The public no-login endpoint exposes roughly the 12 most recent posts, so higher values are capped to what the profile returns. Range 1 to 12. |
maxRecords | integer | no | 10 | Maximum records to collect across all usernames. |
includeRelatedProfiles | boolean | no | false | Also emit the suggested/related accounts as their own records (type: related_profile). They are always attached to each profile record in relatedProfiles regardless of this setting. |
mediaType | enum | no | any | Keep only posts of this media type in Posts mode. One of any, image, video, sidecar (carousel), reel. |
minLikes | integer | no | (none) | Keep only posts with at least this many likes. |
captionContains | string | no | (empty) | Keep only posts whose caption contains this text (case-insensitive). Useful for a campaign keyword or hashtag. |
onlyPostsNewerThan | string | no | (empty) | Keep only posts published on or after this ISO date or timestamp, for example 2026-01-31. |
onlyPostsOlderThan | string | no | (empty) | Keep only posts published on or before this ISO date or timestamp, for example 2026-06-30. |
withAiSentiment | boolean | no | false | Paid AI add-on. Classifies each post caption's sentiment (positive/neutral/negative with a score). Posts mode only. Billed per enriched record. |
withAiTopics | boolean | no | false | Paid AI add-on. Tags each post caption with a content category and topic tags. Posts mode only. Billed per enriched record. |
Filters combine with logical AND and are applied before a post is charged.
Output reference
One dataset item per result. Types: string, integer, boolean, string[], object, or null when the source value is absent.
Fields present on both profile and post records:
| Field | Type | Description |
|---|---|---|
type | string | Record type: profile, post, or related_profile. |
username | string | Account handle without the @. |
fullName | string | Display name of the account. |
url | string | Public URL of the profile or post. |
id | string | Instagram numeric id of the profile or post. |
imageUrl | string | Primary image URL (profile picture, or post display image). |
isVerified | boolean | Whether the account carries a verified badge. |
followersCount | integer | Follower count of the account. |
observedAt | string | ISO 8601 timestamp of when the record was collected. |
error | string | null on success. On a failed username, a single record with a populated error field is written instead. |
Profile record fields (type: profile):
| Field | Type | Description |
|---|---|---|
biography | string | Profile bio text. |
followingCount | integer | Number of accounts the profile follows. |
postsCount | integer | Total public posts on the profile. |
highlightReelCount | integer | Number of story highlight reels. |
isPrivate | boolean | Whether the account is private. |
isBusinessAccount | boolean | Whether Instagram flags the account as a business. |
isProfessionalAccount | boolean | Whether it is a professional (business or creator) account. |
category | string | Public category label of the account. |
categoryEnum | string | Machine category code when present. |
businessCategoryName | string | Business category name when present. |
overallCategoryName | string | Overall category name when present. |
businessContactMethod | string | Public contact method shown (for example CALL, EMAIL), or null. |
businessAddress | string | Single-line public business address, or null. |
businessEmail | string | Public business email when Instagram exposes it (usually null logged-out). |
businessPhoneNumber | string | Public business phone when exposed (usually null logged-out). |
externalUrl | string | Website link in the bio. |
bioLinks | string[] | All link URLs listed on the profile. |
fbid | string | Linked Facebook id when present. |
connectedFbPage | string | Linked Facebook page when present. |
fbProfileBiolink | string | Facebook profile biolink when present. |
profilePicUrl | string | Profile picture URL. |
profilePicUrlHd | string | High-resolution profile picture URL. |
hasThreads | boolean | Whether the account has onboarded to Threads. |
hasChannel | boolean | Whether the account runs a broadcast channel. |
hasClips / hasGuides / hasArEffects | boolean | Feature-presence flags. |
shouldShowPublicContacts | boolean | Whether Instagram shows public contacts for the account. |
isJoinedRecently | boolean | Whether the account joined recently. |
isVerifiedByMv4b | boolean | Meta Verified for Business flag. |
hideLikeAndViewCounts | boolean | Whether like/view counts are hidden. |
isEmbedsDisabled | boolean | Whether embeds are disabled. |
isSupervisionEnabled | boolean | Whether parental supervision is enabled. |
pronouns | string[] | Pronouns listed on the profile. |
bioHashtags | string[] | Hashtags parsed from the bio. |
bioMentions | string[] | @mentions parsed from the bio. |
relatedProfiles | object[] | Suggested/related accounts (username, fullName, id, isVerified, isPrivate, profilePicUrl). |
Post record fields (type: post):
| Field | Type | Description |
|---|---|---|
shortcode | string | Post shortcode used in its URL. |
ownerId | string | Numeric id of the posting account. |
mediaType | string | Source typename: GraphImage, GraphVideo, or GraphSidecar. |
isVideo | boolean | Whether the primary media is video. |
caption | string | Full post caption text. |
accessibilityCaption | string | Auto-generated accessibility caption when present. |
likesCount | integer | Like count. |
commentsCount | integer | Comment count. |
commentsDisabled | boolean | Whether comments are turned off. |
videoViewCount | integer | Video view count when the post is a video. |
isPinned | boolean | Whether the post is pinned to the profile. |
locationName / locationId / locationSlug | string | Tagged location detail when present. |
width / height | integer | Media dimensions in pixels. |
videoUrl | string | Direct video URL when the post is a video. |
thumbnailUrl | string | Thumbnail image URL. |
childImageUrls | string[] | Image URLs of each carousel slide. |
taggedUsers | string[] | Usernames tagged in the media. |
coauthors | string[] | Verified co-authors of the post. |
takenAt | string | ISO 8601 publish timestamp. |
productType | string | Source product type (for example clips for reels). |
isReel | boolean | Whether the post is a reel. |
isCarousel | boolean | Whether the post is a multi-slide carousel. |
childCount | integer | Number of carousel slides. |
hasAudio | boolean | Whether a video post has audio. |
hashtags | string[] | Hashtags parsed from the caption. |
mentions | string[] | @mentions parsed from the caption. |
musicArtist / musicTitle / musicAudioId | string | Reel audio attribution when present. |
musicUsesOriginalAudio | boolean | Whether the reel uses original audio. |
children | object[] | Per-slide detail for carousels (id, shortcode, isVideo, imageUrl, videoUrl, width, height, taggedUsers). |
aiSentiment | string | AI caption sentiment (positive/neutral/negative), only with withAiSentiment. |
aiSentimentScore | integer | AI sentiment score, only with withAiSentiment. |
aiTopics | string[] | AI caption topic tags, only with withAiTopics. |
aiCategory | string | AI content category, only with withAiTopics. |
Example output record
Real carousel post record from a live run (input {"usernames":["9gag"],"resultsType":"posts"}), showing multi-slide detail:
{"type": "post","username": "9gag","fullName": "9GAG: Go Fun The World","url": "https://www.instagram.com/p/Db7k8Qaka8Z/","id": "3961922767671111449","shortcode": "Db7k8Qaka8Z","ownerId": "259220806","followersCount": 52112356,"isVerified": true,"mediaType": "GraphSidecar","isVideo": false,"caption": "How old do I look to you?! Obsession @obsessionthemovie @mcl_cinemas - #Obsession #memes #9gag","likesCount": 18212,"commentsCount": 35,"isPinned": true,"width": 750,"height": 937,"childCount": 8,"isCarousel": true,"hashtags": ["Obsession", "memes", "9gag"],"mentions": ["obsessionthemovie", "mcl_cinemas"],"takenAt": "2026-08-12T09:00:00.000Z","observedAt": "2026-08-14T08:32:22.186Z","error": null}
Run via API and CLI
Start a run and read the dataset. Replace <TOKEN> with your Apify API token.
Run synchronously and get dataset items in one call:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~instagram-scraper/run-sync-get-dataset-items?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"usernames":["nasa","natgeo"],"resultsType":"posts","postsLimit":12,"minLikes":1000}'
Start a run asynchronously:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~instagram-scraper/runs?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"usernames":["starbucks"],"resultsType":"profile"}'
Apify CLI:
apify call scrapers_lat/instagram-scraper \--input '{"usernames":["nasa"],"resultsType":"posts"}'
Fetch results
Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing format:
# JSONcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"# CSVcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"# Paginate large datasetscurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"
<DATASET_ID> is returned as defaultDatasetId in the run object. clean=true drops empty and internal fields.
Billing and limits
- Pay per result. Profile and related-profile records bill on the
resultevent. Post records bill on thedetailsevent. See the pricing tab for current per-record prices. - AI add-ons billed separately.
withAiSentimentandwithAiTopicsbill on theai_sentimentandai_topicsevents, and only when the AI returns usable output. They are off by default and require a paid Apify plan. - No charge on failure. A username that cannot be fetched writes a single record with a populated
errorfield and is not charged. Empty runs cost nothing. - Spend cap respected. Set
maxTotalChargeUsdon the run; once reached, the actor stops emitting and charging further billable records. - Free Apify plans are capped at 10 records per run. Upgrade for higher
maxRecords. - Source limit. The public no-login endpoint exposes roughly the 12 most recent posts per profile, and Instagram rate-limits heavy request bursts. Requests that get rate-limited return an
errorrecord rather than partial data.
FAQ and troubleshooting
Can I scrape an Instagram profile without logging in? Yes. The actor uses only Instagram's public web profile data, so no account, password, or cookies are required. It works on public accounts only.
How many posts can I get per profile?
The public no-login source exposes roughly the 12 most recent posts per profile. postsLimit controls how many of those are returned, up to that ceiling.
Can it scrape private accounts?
No. Private accounts expose no public posts. The actor returns an error record for them and does not charge.
A username returned an error about rate limiting. Why?
Instagram throttles bursts of logged-out requests. When a request is throttled the actor writes an error record for that username instead of partial data, and does not charge it. Re-run that username later or spread runs out.
Why are businessEmail and businessPhoneNumber null?
The logged-out web profile endpoint rarely returns the raw email and phone strings even when a contact button is shown. The actor exposes businessContactMethod and the public businessAddress that the endpoint does return instead. Missing values are returned as null, never invented.
What do the AI fields cost?
aiSentiment/aiSentimentScore and aiTopics/aiCategory are optional paid add-ons, billed only when the AI returns usable output. Leave withAiSentiment and withAiTopics off to skip them entirely.
Is this an official Instagram tool? No. This actor is independent and is not affiliated with, endorsed by, or sponsored by Instagram or Meta Platforms, Inc. It collects only data publicly visible on public profiles, without logging in. You are responsible for using the data, and the business contact fields in particular, in compliance with Instagram's terms, the GDPR, and other applicable privacy laws.
Related scrapers
- YouTube Scraper: YouTube videos and channels by search, video URL, or channel URL.
- X (Twitter) Profiles & Tweets Scraper: Public X posts, authors, and engagement.
- Reddit Posts & Comments Scraper: Reddit posts and comments from subreddits and search.
- TikTok Creative Center Top Ads Scraper: Top-performing TikTok ads by country and period.
- App Store Reviews Scraper: Apple App Store reviews and ratings for any app.
- Google Play App Details Scraper: App listings and details from the Google Play Store.
More scrapers at scrapers.lat
Built and maintained by scrapers.lat, where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at scrapers.lat.
Independent tool, not affiliated with Instagram or Meta Platforms, Inc. Accesses only publicly visible data on public Instagram profiles, without logging in.
