Instagram Profile & Posts Scraper avatar

Instagram Profile & Posts Scraper

Pricing

from $6.15 / 1,000 results

Go to Apify Store
Instagram Profile & Posts Scraper

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

Scrapers Lat

Maintained by Community

Actor stats

0

Bookmarked

17

Total users

3

Monthly active users

21 hours ago

Last modified

Share

Instagram Profile & Posts Scraper

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

Apify Coverage Output Billing

Table of contents

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

FieldTypeRequiredDefaultDescription
usernamesstring[]yes["nasa"]Public Instagram usernames to scrape, without the @. Only public accounts are supported.
resultsTypeenumnopostsprofile returns one profile record per username. posts returns one record per recent public post with profile context.
postsLimitintegerno12Max 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.
maxRecordsintegerno10Maximum records to collect across all usernames.
includeRelatedProfilesbooleannofalseAlso 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.
mediaTypeenumnoanyKeep only posts of this media type in Posts mode. One of any, image, video, sidecar (carousel), reel.
minLikesintegerno(none)Keep only posts with at least this many likes.
captionContainsstringno(empty)Keep only posts whose caption contains this text (case-insensitive). Useful for a campaign keyword or hashtag.
onlyPostsNewerThanstringno(empty)Keep only posts published on or after this ISO date or timestamp, for example 2026-01-31.
onlyPostsOlderThanstringno(empty)Keep only posts published on or before this ISO date or timestamp, for example 2026-06-30.
withAiSentimentbooleannofalsePaid AI add-on. Classifies each post caption's sentiment (positive/neutral/negative with a score). Posts mode only. Billed per enriched record.
withAiTopicsbooleannofalsePaid 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:

FieldTypeDescription
typestringRecord type: profile, post, or related_profile.
usernamestringAccount handle without the @.
fullNamestringDisplay name of the account.
urlstringPublic URL of the profile or post.
idstringInstagram numeric id of the profile or post.
imageUrlstringPrimary image URL (profile picture, or post display image).
isVerifiedbooleanWhether the account carries a verified badge.
followersCountintegerFollower count of the account.
observedAtstringISO 8601 timestamp of when the record was collected.
errorstringnull on success. On a failed username, a single record with a populated error field is written instead.

Profile record fields (type: profile):

FieldTypeDescription
biographystringProfile bio text.
followingCountintegerNumber of accounts the profile follows.
postsCountintegerTotal public posts on the profile.
highlightReelCountintegerNumber of story highlight reels.
isPrivatebooleanWhether the account is private.
isBusinessAccountbooleanWhether Instagram flags the account as a business.
isProfessionalAccountbooleanWhether it is a professional (business or creator) account.
categorystringPublic category label of the account.
categoryEnumstringMachine category code when present.
businessCategoryNamestringBusiness category name when present.
overallCategoryNamestringOverall category name when present.
businessContactMethodstringPublic contact method shown (for example CALL, EMAIL), or null.
businessAddressstringSingle-line public business address, or null.
businessEmailstringPublic business email when Instagram exposes it (usually null logged-out).
businessPhoneNumberstringPublic business phone when exposed (usually null logged-out).
externalUrlstringWebsite link in the bio.
bioLinksstring[]All link URLs listed on the profile.
fbidstringLinked Facebook id when present.
connectedFbPagestringLinked Facebook page when present.
fbProfileBiolinkstringFacebook profile biolink when present.
profilePicUrlstringProfile picture URL.
profilePicUrlHdstringHigh-resolution profile picture URL.
hasThreadsbooleanWhether the account has onboarded to Threads.
hasChannelbooleanWhether the account runs a broadcast channel.
hasClips / hasGuides / hasArEffectsbooleanFeature-presence flags.
shouldShowPublicContactsbooleanWhether Instagram shows public contacts for the account.
isJoinedRecentlybooleanWhether the account joined recently.
isVerifiedByMv4bbooleanMeta Verified for Business flag.
hideLikeAndViewCountsbooleanWhether like/view counts are hidden.
isEmbedsDisabledbooleanWhether embeds are disabled.
isSupervisionEnabledbooleanWhether parental supervision is enabled.
pronounsstring[]Pronouns listed on the profile.
bioHashtagsstring[]Hashtags parsed from the bio.
bioMentionsstring[]@mentions parsed from the bio.
relatedProfilesobject[]Suggested/related accounts (username, fullName, id, isVerified, isPrivate, profilePicUrl).

Post record fields (type: post):

FieldTypeDescription
shortcodestringPost shortcode used in its URL.
ownerIdstringNumeric id of the posting account.
mediaTypestringSource typename: GraphImage, GraphVideo, or GraphSidecar.
isVideobooleanWhether the primary media is video.
captionstringFull post caption text.
accessibilityCaptionstringAuto-generated accessibility caption when present.
likesCountintegerLike count.
commentsCountintegerComment count.
commentsDisabledbooleanWhether comments are turned off.
videoViewCountintegerVideo view count when the post is a video.
isPinnedbooleanWhether the post is pinned to the profile.
locationName / locationId / locationSlugstringTagged location detail when present.
width / heightintegerMedia dimensions in pixels.
videoUrlstringDirect video URL when the post is a video.
thumbnailUrlstringThumbnail image URL.
childImageUrlsstring[]Image URLs of each carousel slide.
taggedUsersstring[]Usernames tagged in the media.
coauthorsstring[]Verified co-authors of the post.
takenAtstringISO 8601 publish timestamp.
productTypestringSource product type (for example clips for reels).
isReelbooleanWhether the post is a reel.
isCarouselbooleanWhether the post is a multi-slide carousel.
childCountintegerNumber of carousel slides.
hasAudiobooleanWhether a video post has audio.
hashtagsstring[]Hashtags parsed from the caption.
mentionsstring[]@mentions parsed from the caption.
musicArtist / musicTitle / musicAudioIdstringReel audio attribution when present.
musicUsesOriginalAudiobooleanWhether the reel uses original audio.
childrenobject[]Per-slide detail for carousels (id, shortcode, isVideo, imageUrl, videoUrl, width, height, taggedUsers).
aiSentimentstringAI caption sentiment (positive/neutral/negative), only with withAiSentiment.
aiSentimentScoreintegerAI sentiment score, only with withAiSentiment.
aiTopicsstring[]AI caption topic tags, only with withAiTopics.
aiCategorystringAI 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:

# JSON
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"
# CSV
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"
# Paginate large datasets
curl "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 result event. Post records bill on the details event. See the pricing tab for current per-record prices.
  • AI add-ons billed separately. withAiSentiment and withAiTopics bill on the ai_sentiment and ai_topics events, 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 error field and is not charged. Empty runs cost nothing.
  • Spend cap respected. Set maxTotalChargeUsd on 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 error record 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.

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.