Instagram Scraper avatar

Instagram Scraper

Pricing

from $0.80 / 1,000 contents

Go to Apify Store
Instagram Scraper

Instagram Scraper

Collect public Instagram profiles, posts, reels, hashtags, places, search results, and tagged posts through anonymous web requests.

Pricing

from $0.80 / 1,000 contents

Rating

0.0

(0)

Developer

Kai

Kai

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

a day ago

Last modified

Categories

Share

Collect public Instagram profiles, posts, reels, and places as structured data. Search for profiles, hashtags, and places, read available posts, or fetch a known post. Each result is one item in the default dataset.

You do not need an Instagram account or login cookies. Collection uses public Instagram data. Instagram can still block a request, even for public content.

Profile posts and tagged posts can continue across pages when Instagram permits access. Profile reels, place posts, and hashtag posts use one public page. Hashtag results include only posts whose full caption contains the exact hashtag. These results are a limited sample, not a complete hashtag feed.

Use cases

  • Creator research: compare public profile details and available engagement counts.
  • Brand monitoring: collect posts from known public accounts.
  • Content research: collect captions, hashtags, images, reels, and carousel media.
  • Location research: collect details and posts from known places.
  • Reporting: export results for analysis in a spreadsheet or another application.

Data you can collect

  • Profiles: username, name, biography, links, profile image, follower and post counts, account flags, and available related profiles.
  • Posts and reels: caption, author, posting time, available like, comment, view, and play counts, media links, dimensions, and video duration.
  • Carousels: images and videos in their original order, inside one post item.
  • Post context: hashtags, text mentions, tagged users, co-authors, location, music details, and comment previews when Instagram supplies them.
  • Places: name, coordinates, address, city, country, website, category, and available post count.
  • Hashtags: name, post count, and available profile image.

A field can be missing or null when Instagram does not supply it. Full comment threads, replies, Stories, audio lookup, and private account data are not supported.

Choose how to collect

Set one mode and put its targets in the targets list.

What you wantSet mode toPut in targets
Profile detailsprofileUsernames or profile URLs
One or more known posts or reelspostPost/reel URLs, shortcodes, or numeric media IDs
Posts from a profilepostsUsernames or profile URLs
Reels from a profilereelsUsernames or profile/reels URLs
Available posts with an exact hashtaghashtagHashtags or hashtag URLs
Hashtag detailshashtagDetailsHashtags or hashtag URLs
Place detailsplacePlace IDs or place URLs
Posts shown on a place pageplacePostsPlace IDs or place URLs
Profiles, hashtags, or places that match a phrasesearchSearch phrases; select searchType and searchResults
Posts that tag an accountmentionsUsernames or profile URLs

mentions mode collects posts that tag the account. It does not search for text mentions in captions. Place pages can include posts from the surrounding area; each post keeps its own location when available.

Use @123 for a username that contains only digits. Numeric profile IDs are not supported. In post mode, a target that contains only digits is treated as a media ID.

Start a run

  1. Open the Actor's Input tab in Apify Console.
  2. Select a mode and enter its targets, or use one of the JSON examples below.
  3. Set the maximum results and check the proxy settings.
  4. Select Start.
  5. Open Output to view the results. Select Export to download them.

For Console instructions, see Apify's run guide.

Read profile details

{
"mode": "profile",
"targets": ["instagram", "nasa"],
"maxItems": 2
}

Collect recent posts

Collect up to 10 posts from the profile's public page. Keep posts from the last seven days and omit posts marked as pinned.

{
"mode": "posts",
"targets": ["instagram"],
"maxItems": 10,
"onlyNewerThan": "7 days",
"skipPinnedPosts": true,
"addParentData": true
}

Collect reels and save media files

{
"mode": "reels",
"targets": ["instagram"],
"maxItems": 10,
"downloadMedia": true
}

Fetch a known post

Replace the URL with the post or reel you need.

{
"mode": "post",
"targets": ["https://www.instagram.com/p/DZxvMgyH8yR/"],
"maxItems": 1
}

Read place details

{
"mode": "place",
"targets": ["213385402"],
"maxItems": 1
}

Search for a public profile

Search by a phrase, then collect details for the first matching public profile.

{
"mode": "search",
"targets": ["national geographic"],
"searchType": "profile",
"searchResults": "details",
"searchLimit": 1,
"maxItems": 1
}

Use searchType: "place" to find places or searchType: "hashtag" to find hashtags. Set searchResults to posts or reels to collect available media from the matches. Profile search also accepts mentions for tagged posts. Search reads one batch of available matches; it does not return every match. A phrase can have no matches. A public page can have no posts that meet your filters.

Input

Both mode and targets are required. Invalid targets or incompatible options stop the run before collection.

FieldTypeDefaultBehaviour
modestringRequiredOne mode from the selection table.
targetsstring[]Required1–100 targets of the same type. Duplicate targets are removed.
maxItemsinteger100Maximum saved items across the run. Range: 1–10,000.
maxItemsPerTargetinteger100Maximum saved items for each input target. Range: 1–1,000. A search query is one target.
maxRequestsinteger500Maximum request attempts. Range: 1–10,000. Includes connection setup, retries, detail checks, and downloads.
onlyNewerThanstringNoneKeep posts after a UTC date, timestamp, or relative time such as 7 days.
skipPinnedPostsbooleanfalseOmit posts marked as pinned.
onlyReelsbooleanfalseKeep only posts identified as reels.
addParentDatabooleanfalseAdd the source profile, hashtag, or place identity to post results.
addProfileStatisticsbooleanfalseAdd statistics from a sample of posts. Profile detail output only.
statisticsLimitinteger12Maximum posts in the statistics sample. Range: 1–100.
searchTypestringhashtagprofile, hashtag, or place. user is an alias for profile. Search mode only.
searchResultsstringdetailsdetails, posts, or reels. Profile search also accepts mentions.
searchLimitinteger10Maximum matches to process for each search query. Range: 1–250.
downloadMediabooleanfalseSave available post, reel, and carousel media files.
maxMediaBytesinteger26214400Maximum bytes per media file. Default: 25 MiB. Range: 1–104,857,600 bytes.
proxyConfigurationobject{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"]}Use Apify Proxy, supply HTTP/HTTPS proxy URLs, or set useApifyProxy to false.

Filters and statistics

Dates, pinned-post exclusion, reel filters, and downloads apply to post output. They cannot be used with profile, hashtag, or place detail output. Posts with missing dates are excluded when a date filter is set. Relative dates use the start time of the original run, including after a restart. A month means 30 days; a year means 365 days.

Profile statistics use the first available posts, up to statisticsLimit. The result includes sampleSize, averageLikes, averageComments, and engagementRate. Engagement rate is (average likes + average comments) / followers × 100. Missing counts produce null values. These statistics describe the sample; they do not measure reach or impressions.

Proxies and costs

Apify Residential Proxy is enabled by default. Direct cloud requests and the default data-center proxy were redirected to login in the latest checks. A proxy does not guarantee access to Instagram. If you supply several custom proxy URLs, the Actor uses the first one.

A result can require several requests. Use maxItems to limit saved results and maxRequests to limit collection work. Proxy traffic, media transfer, and file storage can add costs.

Output

The default dataset contains one item per profile, post, hashtag, or place. The recordType field identifies its type. Reels and carousels use recordType: "post".

View the dataset in Apify Console or export it as JSON, CSV, Excel, XML, or HTML. JSON keeps nested objects and arrays, such as carousel media and comment previews. See Apify's dataset guide for export options.

Output at a glance

GroupMain fields
Every itemrecordType, schemaVersion, id, inputUrl, url, scrapedAt
Profile identity and linksusername, fullName, biography, externalUrl, bioLinks, profilePicUrl
Profile counts and flagsfollowersCount, followingCount, postsCount, isPrivate, isVerified, isBusinessAccount, categoryName
Optional profile datarelatedProfiles, statistics
Post content and authorshortCode, caption, timestamp, author, hashtags, mentions, taggedUsers, coauthors
Post countslikesCount, commentsCount, viewCount, playCount, shareCount, reshareCount
Post mediamediaType, productType, displayUrl, videoUrl, dimensions, videoDuration, childPosts
Available post contextlocation, musicInfo, firstComment, latestComments, isPinned, isSponsored, isCommentsDisabled, accessibilityCaption
Hashtag detailsname, postsCount, profilePicUrl, relatedTags, postsPerDay
Place detailsname, latitude, longitude, address, city, country, website, category, postsCount
Added source and filesparentData, downloads

IDs are strings. Dates use UTC ISO 8601. scrapedAt is the collection time; a post's timestamp is its posting time. Unavailable counts are null. If the full post page omits a count, the Actor keeps an available count from the public feed. A known zero stays 0. Views and plays are separate counts.

This example uses fictional values to show a post item. It is not a live result.

{
"schemaVersion": 1,
"recordType": "post",
"id": "1",
"inputUrl": "https://www.instagram.com/example_creator/",
"url": "https://www.instagram.com/p/B/",
"scrapedAt": "2026-09-24T10:00:00.000Z",
"shortCode": "B",
"mediaType": "image",
"productType": "feed",
"timestamp": "2026-09-23T09:00:00.000Z",
"caption": "A sample photo #travel",
"likesCount": 42,
"commentsCount": 3,
"viewCount": null,
"playCount": null,
"author": {
"id": "10",
"username": "example_creator",
"fullName": "Example Creator",
"profilePicUrl": null,
"isVerified": false,
"isPrivate": false
},
"displayUrl": "https://example.com/photo.jpg",
"videoUrl": null,
"dimensions": { "width": 1080, "height": 1080 },
"videoDuration": null,
"childPosts": [],
"hashtags": ["travel"],
"mentions": [],
"downloads": []
}

Carousels, previews, and media files

A carousel counts as one result. Its ordered childPosts array contains each image or video, its URL, dimensions, and available duration. Available comment previews stay inside the post's latestComments array. These previews are not complete comment threads.

With downloadMedia: true, available media files are saved in the run's key-value store. Each downloads entry contains the media ID, file type, source URL, storage key, and download URL. Videos can also include a poster image. Files above maxMediaBytes are rejected. Source media URLs can expire, so save files you need to keep.

Collection behaviour

Limits and duplicate results

For profile posts, the Actor requests more pages until it reaches a selected limit or the end of the available feed. Instagram can refuse a later page. If the first feed request fails, the Actor can use posts from the public profile page when that page contains valid data. This fallback is limited to one page.

Reel feeds and place feeds also use one public page. Profile and reel pages currently supply up to 12 posts; place pages can supply a different count. When this page contains only part of the feed, saved results are partial. Increasing the result limit does not remove that page limit. Filters and duplicate removal can reduce the number of saved results.

Each record type and ID is saved once across all input targets. If the same post appears under two targets, it keeps the first target's inputUrl. It does not count again under the second target. maxItems and maxItemsPerTarget count saved items after filtering.

Access and unsupported features

Only public profiles and media are collected. If the Actor cannot confirm that an account is public, it does not save its profile or posts.

The Actor does not accept account cookies or offer login. It does not collect full comment threads, replies, Stories, standalone audio details, or profiles by numeric ID. Music fields and comment previews can still appear when Instagram supplies them with a post.

Missing or partial results

Saved results remain available when a later request fails. Open Run summary, the OUTPUT record in the run's key-value store, to see the saved count and the reason collection stopped for each target.

Check that the target exists and is public. Check your date filters and result, request, and budget limits. A valid target can return no results. If Instagram temporarily refuses access, try a smaller run later. A retry does not guarantee access.

Restart an interrupted run

Use the same input and storage to resume an interrupted run. Previously saved items are kept and are not saved again. Relative dates use the original start time. Request counts continue from the saved total.

Restarting does not retry targets already marked complete, partial, or failed. Start a new run to retry those targets or change the input.