# Instagram Scraper: Profiles, Posts, Reels (`deepmine/instagram-scraper`) Actor

Instagram scraper for profiles, posts, reels and comments in one form: paste profile, post or reel URLs or usernames and pick what to get. Posts, reels with plays and MP4 links, reels with a hashtag, profile details, comments. No login, no cookies.

- **URL**: https://apify.com/deepmine/instagram-scraper.md
- **Developed by:** [DeepMine](https://apify.com/deepmine) (community)
- **Categories:** Social media, Lead generation
- **Features:** Limited permissions
- **Stats:** 15 total users, 8 monthly users, 99.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.69 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Instagram Scraper: Profiles, Posts, Reels, Comments

Instagram scraper for profiles, posts, reels and comments in one form: choose what you want, paste profile, post or reel URLs, usernames or hashtags in one list, and get one row per post, reel, profile or comment, with the key names apify/instagram-scraper uses. It never logs in.

| 🏷️ Username | 📝 Caption | ❤️ Likes | 💬 Comments | ▶️ Plays | 📅 Posted |
|---|---|---|---|---|---|
| natgeo | Even a moment’s rest on Everest can come with a re… | 37,739 | 174 | 1,305,831 | 2026-10-27 |
| nasa | POV: you're watching the Earth set We just release… | 755,960 | 7,645 | 11,080,750 | 2026-10-10 |
| natgeo | Your phone isn’t rotting your brain—but cell death… | 72,460 | 218 | – | 2025-06-22 |

<sub>Collected 2026-10-30 (Content to scrape = Posts).</sub>

**$0.99 per 1,000 results** on the Starter plan ($1.15 Free, $0.85 Scale, $0.69 Business). A result is one post, reel, profile or comment. The prefilled run (41 posts) costs about $0.041 ($0.047 on Free). Profile details rows (Content to scrape = Details) also charge a flat $0.30 per 1,000 Profile details event, so a Details row costs $1.29 per 1,000 on Starter. No start fee; skipped, private and unknown inputs aren't charged.

### What you can scrape

Pick 🎯 **Content to scrape**, then paste what you have in any mix: profile URLs, post and reel URLs, hashtag URLs, usernames, hashtags and search words. Each input is read by the content you chose; the ones that content can't read are listed as skipped (in the run's status message and in the summary), never charged.

| Content to scrape | Reads | One row is |
|---|---|---|
| 📸 **Posts** | profile URLs and usernames, post URLs, reel URLs | a post or reel: caption, hashtags, likes, comments, latest comments, media, tagged users, music, reel plays |
| 🎞️ **Reels** | profile URLs and usernames, reel URLs, hashtags (reels that hold the hashtag), search words (a topic search) | a reel: plays, views, likes, comments, date, sound, caption, latest comments, MP4 and audio links |
| 🪪 **Profile details** | profile URLs, usernames, numeric ids | a profile: bio, links, followers, following, posts, category, flags, latest posts and reels |
| 💬 **Comments** | post URLs, reel URLs | a comment: text, author, likes, date |

#### Hashtags

With Content = Reels, a hashtag (the Hashtags field, `#word`, or a `/explore/tags/<tag>/` URL) finds public reels through Instagram's logged-out topic pages and their related searches, and keeps only the reels whose caption holds that exact hashtag. A reel that only says the words, or holds a longer hashtag, is left out and never charged.

This isn't Instagram's top or recent hashtag feed: reels come in the topic pages' order, they can be months old, and a hashtag can return fewer reels than you ask for. A hashtag that comes up short is named in the run's status message and under `instagramScraper.hashtags` in the run summary, with what was delivered and what was checked. That's a short result, not a failed run, and you pay only for the rows delivered.

Search words are a topic search: rows name the words in the caption, hashtags or creator name, not always as a hashtag.

#### Not supported yet

- **Hashtag feeds** (a hashtag's top and recent posts) aren't read here. A hashtag finds reels that hold it (above); Content = Posts skips hashtags and says so.
- **Place and location pages**, place search, profile search by name (put the usernames under 👤 Usernames), hashtag analytics (volume, related tags).
- **Mentions** (posts a profile is tagged in) and **stories**: both need a login.
- **Replies to comments**: Instagram shows them to logged-in users only, so `includeNestedComments` is accepted and ignored.
- Shares and saves counts, followers and following lists.

Saved inputs of apify/instagram-scraper run here: `resultsType`, `directUrls`, `resultsLimit`, `onlyPostsNewerThan`, `search`, `searchType`, `searchLimit` and `addParentData` are read as they are; what the Actor can't read (above) ends with a clear message, not a silent empty run.

### How to use it

1. Choose 🎯 **Content to scrape** (Posts is the default).
2. Paste 🔗 **Instagram URLs** (and, under ➕ More inputs, usernames, hashtags or search words).
3. Set 💯 **Results per input** (20 in the prefill, 100 by default): posts or reels per profile or hashtag, comments per post. Optional: 📅 **Newer than** (`2026-09-01`, `7 days`), 📌 **Skip pinned posts**.
4. Press Start. Rows land as they are read; download them as CSV, Excel or JSON, or call the Actor from the API.

Posts from profiles and a post:

```json
{
  "resultsType": "posts",
  "directUrls": [
    "https://www.instagram.com/natgeo/",
    "https://www.instagram.com/nasa/",
    "https://www.instagram.com/p/DLNsnpUTdVS/"
  ],
  "resultsLimit": 20
}
```

Reels of a profile, and reels with a hashtag:

```json
{
  "resultsType": "reels",
  "directUrls": ["https://www.instagram.com/natgeo/"],
  "hashtags": ["homeworkout"],
  "resultsLimit": 20
}
```

Profile details (`"resultsType": "details"`) take `usernames` or profile URLs; comments (`"resultsType": "comments"`) take post and reel URLs.

### Real rows

🎞️ Reels (`resultsType: reels`), collected 2026-10-30:

| 🏷️ Username | 📝 Caption | ▶️ Plays | ❤️ Likes | 💬 Comments | 📅 Posted |
|---|---|---|---|---|---|
| natgeo | Extreme winds and collapsing tents on the North Fa… | 771,643 | 29,178 | 98 | 2026-10-29 |
| natgeoscience | Avoiding black holes is pretty easy on Earth—but d… | 881,528 | 21,024 | 181 | 2026-10-28 |
| natgeo | Even a moment’s rest on Everest can come with a re… | 1,306,113 | 37,742 | 174 | 2026-10-27 |

🪪 Profile details (`resultsType: details`), collected 2026-10-30:

| 🏷️ Username | 👤 Name | 👥 Followers | ➡️ Following | 📸 Posts | 🏢 Category |
|---|---|---|---|---|---|
| nasa | NASA | 104,361,175 | 90 | 4,984 | Government Agencies |
| natgeo | National Geographic | 268,255,656 | 195 | 32,130 | – |
| humansofny | Humans of New York | 12,638,555 | 763 | 5,877 | – |

💬 Comments (`resultsType: comments`), collected 2026-10-30 (commenters' usernames replaced):

| 🏷️ Username | 📝 Comment | ❤️ Likes | 📅 Date |
|---|---|---|---|
| fan_1 | 🔥 | 0 | 2026-04-23 |
| fan_2 | The irony that ancient brains last millennia while… | 0 | 2025-11-02 |
| fan_3 | Amen. | 0 | 2025-07-31 |

### Output

The Console shows a view for each content, named after it: 📸 Posts, 🎞️ Reels, 📈 Post stats, 🎬 Media and 👥 People (posts and reels); 💬 Comments and 👥 Commenters; 🪪 Profiles, 🔎 Profile details, 📈 Profile stats, 🎬 Reel stats and 🗂️ Profile record. A run fills the views of its own content; open the one that matches (`?view=<name>` in the API). Long texts show as 50-character snippets there; the rows keep the full text.

The run summary (OUTPUT) lists every input with its status and what the run read, and, under `instagramScraper`, the content, the engine that read it, the inputs it skipped with the reason, and what each hashtag delivered.

#### Posts and reels fields

- `inputUrl`: The profile, post or reel URL from your list this row came from (a username becomes https://www.instagram.com/<username>).
- `id`: Instagram's id for the post or reel (its media id).
- `type`: Image, Video or Sidecar (a carousel).
- `shortCode`: The post's code in its URL (instagram.com/p/<code>/).
- `caption`: The post's caption text.
- `hashtags`: Hashtags in the caption, without #.
- `mentions`: @usernames in the caption, without @.
- `url`: The post's or reel's URL.
- `commentsCount`: Comments on the post.
- `firstComment`: The text of the first of latestComments (Detailed data).
- `latestComments`: Detailed data: the comments Instagram shows on the post's page to visitors who aren't logged in (usually 10-15, newest first), each with id, text, ownerUsername, ownerProfilePicUrl, timestamp, repliesCount, likesCount and owner. Each also has media: a GIF comment's GIF URL (null for text).
- `dimensionsHeight`: The picture's or video's height in pixels.
- `dimensionsWidth`: The picture's or video's width in pixels.
- `originalHeight`: The height of the media as uploaded.
- `originalWidth`: The width of the media as uploaded.
- `displayUrl`: The post's picture (a video's cover), largest size.
- `images`: A carousel's pictures, in order.
- `alt`: Detailed data: the post's alt text (Instagram's own description of the picture, or the one its author wrote).
- `likesCount`: Likes on the post or reel (null when its author hides the count).
- `videoViewCount`: Detailed data: a video's views, Instagram's view counter (lower than plays; the same number as apify's videoViewCount), from the video's embed page. A carousel's videos have theirs in childPosts. Null for pictures and in Basic data.
- `timestamp`: When the post or reel went up (UTC, ISO 8601).
- `childPosts`: A carousel's items, each with its own id, type, picture, video URL, size, alt text, tagged users and tag positions (taggedUserPositions).
- `ownerFullName`: The author's display name.
- `ownerUsername`: The post's or reel's author: username.
- `ownerId`: The post's or reel's author: Instagram user id.
- `productType`: feed (a picture), carousel_container (a carousel), clips (a reel) or igtv.
- `isCommentsDisabled`: Comments are turned off; false when Instagram showed the post's comments (Detailed data), else null.
- `paidPartnership`: Marked as a paid partnership.
- `sponsors`: The brands of a paid partnership, each with id and username.
- `videoUrl`: The video file's URL (it expires after a few days).
- `taggedUsers`: Accounts tagged in the picture, each with full_name, id, is_verified, profile_pic_url and username.
- `coauthorProducers`: Collab coauthors, each with id, is_verified, profile_pic_url and username.
- `audioUrl`: A video's separate audio track (its DASH audio stream).
- `videoDuration`: A video's length in seconds.
- `musicInfo`: The post's sound: artist_name, song_name, uses_original_audio, should_mute_audio, should_mute_audio_reason, audio_id.
- `videoPlayCount`: Detailed data: a reel's plays, from its author's reels tab (for a profile, read back as far as the posts go, and for its pinned reels back to their date; for a reel URL, paged until the reel; at most 15 pages for a pinned reel or a URL). Null for videos that aren't reels.
- `isPinned`: Pinned to the top of the author's grid.
- `captionSnippet`: The caption's first 50 characters (… when cut), for the table views.
- `firstCommentSnippet`: firstComment's first 50 characters (… when cut), for the table views.
- `taggedUsernames`: The usernames of taggedUsers, as a flat list.
- `sponsorUsernames`: The usernames of sponsors (a paid partnership's brands), as a flat list.
- `musicArtist`: musicInfo's artist_name: the sound's artist (the author's username for original audio).
- `musicSong`: musicInfo's song_name: the sound's title ("Original audio" for the author's own).
- `coauthors`: The coauthors' usernames.
- `invitedCoauthors`: The usernames of invitedCoauthorProducers, as a flat list.
- `invitedCoauthorProducers`: Accounts invited to the collab that haven't accepted (yet), each with id, is_verified, profile_pic_url and username.
- `childPostsCount`: How many items a carousel has.
- `locationName`: The tagged location's name.
- `locationId`: The tagged location's Instagram id.
- `location`: The tagged place, every field Instagram sends: id, name, slug, lat, lng, address, city, zipCode, shortName, facebookPlacesId (null where Instagram leaves one out; a profile's grid sends id, name, lat and lng).
- `taggedUserPositions`: Every user tag with where it sits on the picture: username, id, x and y (0-1 from the top left). A user tagged twice comes twice; carousel items (childPosts) have their own.
- `ownerIsVerified`: The post's or reel's author has the verified badge.
- `ownerProfilePicUrl`: The post's or reel's author: profile picture.
- `likesHidden`: The author hides the like count.
- `sourceType`: profile (from a profile's grid) or post (a post URL you gave).
- `scrapedAt`: When the run read the post or reel (UTC).

Reels rows (Content = Reels) have the same keys, in the same order, without the ones a reel can't fill (`childPostsCount`, `invitedCoauthors`, `invitedCoauthorProducers`, `location`, `taggedUserPositions`), plus:

- `authorFollowers`: The creator's follower count (with reel details on, the default).
- `fbLikeCount`: Likes on the reel's Facebook cross-post, when the creator shares reels to Facebook (with details on, the default).
- `rank`: Position in the list Instagram suggested it in (1 = first); in Profiles themselves mode, the position in your input list.

#### Comment fields

- `postUrl`: The post's URL (https://www.instagram.com/p/<code>/; a reel opens there too).
- `commentUrl`: A link straight to the comment (https://www.instagram.com/p/<code>/c/<comment id>/).
- `id`: The comment's own Instagram id (the post's media id is `postId`).
- `text`: The comment's text, emoji included (null for a comment that is only a GIF: its GIF is in media).
- `ownerUsername`: The commenter's username.
- `ownerProfilePicUrl`: The commenter's profile picture.
- `timestamp`: When the comment was written (UTC, ISO 8601).
- `likesCount`: Likes on the comment.
- `owner`: The commenter as apify/instagram-comment-scraper nests it: id, username, profile_pic_url, is_verified, plus full_name, is_private, is_mentionable, profile_pic_id, latest_reel_media and fbid_v2. full_name, is_private and fbid_v2 come from the commenter's profile with Commenter details on; the others are null (Instagram doesn't show them to visitors who aren't logged in).
- `url`: The URL of the post or reel the comment is on (same as `postUrl`; the comment's own link is `commentUrl`).
- `parentCommentUrl`: Always null: every row is a top-level comment (Instagram shows replies to logged-in users only).
- `repliesCount`: Always null: Instagram sends no reply counts to visitors who aren't logged in.
- `replies`: Always null: Instagram shows replies to logged-in users only, and this Actor never logs in.
- `media`: A GIF comment's GIF (its image URL, as Instagram shows it on the post's page); null for text comments. apify/instagram-comment-scraper's name for it.
- `textSnippet`: The comment's first 50 characters (… when cut), for the table views.
- `position`: The comment's place among the post's comments: newest first (1 = the newest), or its like rank (1 = the most liked) with Sort comments = Most liked first.
- `isRanked`: true when the rows are in like order (Sort comments = Most liked first) and position is the like rank; false in Instagram's newest-first order.
- `postShortCode`: The post's code in its URL (instagram.com/p/<code>/).
- `postId`: Instagram's media id for the post.
- `ownerId`: The commenter's Instagram user id.
- `ownerIsVerified`: The commenter has the verified badge.
- `ownerProfileUrl`: The commenter's profile URL.
- `isGif`: The comment is a GIF from Instagram's GIF picker.
- `inputUrl`: The post or reel URL from your list this comment came from.
- `scrapedAt`: When the run read the comment (UTC).

#### Profile fields

- `profilePicUrl`: Profile picture (150x150). Instagram signs picture links; they stop working after a few days.
- `fullName`: Display name.
- `biography`: Full bio text.
- `biographySnippet`: First 50 characters of the bio.
- `username`: Instagram username (handle), without @.
- `profileUrl`: Profile URL.
- `businessCategoryName`: The category the profile shows (Digital creator, Athlete, Nonprofit organization...); null when it hides it.
- `externalUrl`: The profile's website (its first bio link).
- `contactEmail`: An email address written in the bio or name, when there is one (Instagram shows business emails only to logged-in app users).
- `contactPhone`: A phone number written in the bio or name, or a WhatsApp number from the bio links, when there is one.
- `bioLinks`: Every link in the bio: URL, title, type, Instagram's link, pinned flag, image, link id, media type, accent colour and creation source.
- `isVerified`: Has the blue check.
- `isPrivate`: Private account.
- `isBusinessAccount`: A business account.
- `isProfessionalAccount`: A business or creator account.
- `accountType`: personal, business or creator.
- `followersCount`: Exact follower count.
- `followsCount`: Accounts this profile follows.
- `postsCount`: Exact number of posts (with followers and engagement on).
- `hasReels`: The profile has reels (its latest reels and their views are in latestReels).
- `avgLikes`: Average likes on its latest posts (up to 6; posts that hide likes left out).
- `avgComments`: Average comments on its latest posts (up to 6).
- `engagementRate`: (Average likes + average comments) / followers, in percent (1.5 = 1.5%).
- `lastPostAt`: When its newest post was published (UTC).
- `reelsMedianViews`: Median views (plays) of its latest reels (up to 12, pinned ones included), as the profile's reels tab shows them.
- `reelsAvgViews`: Average views (plays) of its latest reels (up to 12).
- `reelsAvgLikes`: Average likes on its latest reels (reels that hide likes left out).
- `reelsAvgComments`: Average comments on its latest reels.
- `reelsViewsToFollowers`: Median reel views over followers, in percent (100 = a typical reel is watched as many times as the profile has followers).
- `lastReelAt`: When the newest of its latest reels was posted (UTC; from the reel's id, accurate to about a minute).
- `highlightReelCount`: The number of story highlights on the profile. Unavailable logged out since 2026-11-03: null.
- `hasPublicStory`: A story is up right now (its newest story went up in the last 24 hours).
- `igtvVideoCount`: Its IGTV (long video) count. Unavailable logged out since 2026-11-03: null.
- `hasChannel`: It runs a broadcast channel. Unavailable logged out since 2026-11-03: null.
- `joinedRecently`: Instagram marks the account as new. Unavailable logged out since 2026-11-03: null.
- `latestPosts`: With '🖼️ Include latest posts' on (the default): its latest 12 posts (pinned ones included), in the shape of Apify's Instagram Profile Scraper: type, caption, hashtags, mentions, likes, comments, video URL, time, image and carousel pictures, size, alt text, product type, location, tagged users, coauthors, sponsors, paid-partnership flag, music and child posts. Every video (carousel videos too) gets its views (videoViewCount: from Instagram's app record where it answers, else from the video's own embed page); reels also get their play count (videoPlayCount).
- `latestIgtvVideos`: With '🖼️ Include latest posts' on (the default): its latest IGTV (long) videos (up to 12) with title, duration, views, likes, comments, time, video URL and picture. Unavailable logged out since 2026-11-03: null.
- `latestReels`: Its latest reels (up to 12, pinned ones included): shortCode, url, playCount (views), likeCount, commentCount, postedAt and isPinned.
- `relatedProfiles`: The profiles Instagram lists as related to this one (up to 50), each with id, full_name, is_private, is_verified, profile_pic_url and username (none for private profiles and for big brands Instagram suggests nothing for).
- `bioMentions`: Usernames the bio links to (@sweat, @vaynermedia...).
- `bioHashtags`: Hashtags the bio links to.
- `pronouns`: Pronouns the profile shows.
- `threadsUsername`: Threads handle when the profile shows its Threads badge.
- `isActiveOnThreads`: Shows its Threads badge.
- `linkedFacebookPage`: The Facebook page the profile links, when it shows one (id and name).
- `businessAddress`: The business address as Instagram stores it (street_address, city_name, city_id, zip_code, latitude, longitude), when the profile shows one.
- `addressStreet`: Business street address, when the profile shows one (rare).
- `city`: Business city, when the profile shows an address (rare).
- `zipCode`: Business ZIP or postal code, when the profile shows an address (rare).
- `transparencyLabel`: Instagram's label for state-controlled media and similar accounts.
- `transparencyProduct`: Where Instagram shows that label.
- `isMemorialized`: A memorialized account.
- `isEmbedsDisabled`: The profile turned off embedding its posts on other sites.
- `isUnpublished`: Instagram's unpublished-account flag.
- `hasStoryArchive`: The account keeps a story archive (Instagram sends it only to logged-in users; usually null).
- `hasProfilePic`: The account has a profile picture (usually null logged out).
- `latestStoryAt`: When its newest story went up (UTC), when Instagram shows one (a story stays up 24 hours); null when it has none.
- `hideCreatorMarketplaceBadge`: The profile hides its creator marketplace badge.
- `isRegulatedC18`: Instagram marks the account as regulated 18+ content (alcohol, gambling and similar).
- `isCoppaEnforced`: Instagram applies children's-privacy (COPPA) rules to the account (usually null logged out).
- `isCannes`: Instagram's is_cannes flag, passed through as sent.
- `hasLongformMedia`: Instagram's has_longform_media flag: the account has long-form videos.
- `shouldShowCategory`: The profile shows its category on its page.
- `showAccountTransparencyDetails`: Instagram shows the 'About this account' details for it.
- `profilePicGenaiToolInfo`: Instagram's AI-tool info for the profile picture, when it has any.
- `externalUrlLinkshimmed`: The website as Instagram links it (through l.instagram.com).
- `profilePicUrlHD`: Profile picture, full size (signed link, expires after a few days).
- `inputUrl`: The profile URL from your list this profile came from (a username becomes https://www.instagram.com/<username>).
- `seedUsername`: The input profile this result was found for (Profiles themselves mode: the profile itself).
- `depth`: 1 = suggested for the input profile, 2 = suggested for a depth-1 profile, and so on; 0 = an input profile itself (Profiles themselves mode).
- `rank`: Position in the list Instagram suggested it in (1 = first); in Profiles themselves mode, the position in your input list.
- `discoveredFrom`: Username of the profile whose suggestions listed it (empty in Profiles themselves mode).
- `id`: The profile's Instagram account id (the `ownerId` of its posts and reels).
- `fbid`: Instagram's Facebook-wide id for the account.
- `scrapedAt`: When the run read the profile (UTC).
- `url`: The profile's URL (same as `profileUrl`).
- `private`: The same as isPrivate, under Apify's Instagram Profile Scraper's name.
- `verified`: The same as isVerified, under Apify's Instagram Profile Scraper's name.
- `externalUrls`: The bio links in Instagram's own shape, as Apify's Instagram Profile Scraper gives them: url, title, link_type, lynx_url (plus is_pinned, image_url, link_id, media_type, media_accent_color_hex, creation_source when Instagram sends them). The same links as bioLinks.
- `externalUrlShimmed`: The same as externalUrlLinkshimmed, under Apify's Instagram Profile Scraper's name.
- `facebookPage`: The linked Facebook page's name (linkedFacebookPage has its id too), under Apify's Instagram Profile Scraper's name.
- `threadsNetProfile`: {username} of the profile's Threads account when it shows the Threads badge (threadsUsername), as Apify's Instagram Profile Scraper names it.

### Compared with apify/instagram-scraper

- **Price:** $0.99 per 1,000 results on Starter here ($1.29 for Profile details); apify/instagram-scraper charges $2.30 per 1,000 results on Starter (checked 2026-10-29).
- **Same key names** for posts, reels, profiles and comments (its `shortCode`, `ownerUsername`, `videoPlayCount`, `followersCount`, `latestComments`...). A few keys it declares for legacy or login-only data aren't filled here: `igPlayCount`, `fbPlayCount`, `affiliate`, `pk`, `redirectedFromUrl`, `isRestrictedProfile`, `restrictionReason`.
- **One content per run**, like its `resultsType`; unlike it, an input the content can't read is skipped and named instead of failing the run.
- **Not covered yet:** the list under *Not supported yet* (hashtag feeds, places, mentions, stories).

### Good to know

- The Actor never logs in and uses no cookies: it reads what Instagram shows any visitor. Private profiles and unknown usernames give no rows and cost nothing.
- Comments are the ones Instagram shows without a login. Reel plays (`videoPlayCount`) and video views (`videoViewCount`) are two different Instagram counters.
- Video, audio and picture URLs are Instagram's CDN links: they expire after a few days, so download what you need soon after the run.
- A reel, post or comment that several of your inputs reach is delivered and charged once per run. A restarted or resurrected run never delivers or charges a row twice.
- You pay per result delivered. A spending limit stops the run cleanly at the result it pays for.

### Use it from code and AI agents

Run it from the API, from Make, n8n or Zapier, or give it to an AI agent through the Apify MCP server: <a href="https://mcp.apify.com?tools=deepmine/instagram-scraper" target="_blank">mcp.apify.com?tools=deepmine/instagram-scraper</a>. The Actor's input is the JSON above.

### Related Actors

Single-job versions of the same engines: <a href="https://apify.com/deepmine/instagram-post-scraper" target="_blank">Instagram Post Scraper</a>, <a href="https://apify.com/deepmine/instagram-reels-scraper" target="_blank">Instagram Reels Scraper</a>, <a href="https://apify.com/deepmine/instagram-profile-scraper" target="_blank">Instagram Profile Scraper</a> and <a href="https://apify.com/deepmine/instagram-comments-scraper" target="_blank">Instagram Comments Scraper</a>.

### Feedback

Missing a field or a kind of input? Open an issue on the Actor's Issues tab and it gets looked at. If the Actor saved you time, a short review on its Store page helps other people find it.

# Actor input Schema

## `resultsType` (type: `string`):

What each row is. Posts: profile, post and reel URLs. Reels: profiles, reel URLs, and hashtags (reels that hold the hashtag). Details: profiles. Comments: post and reel URLs.

## `directUrls` (type: `array`):

Profile (instagram.com/natgeo/), post (/p/…), reel (/reel/…) or hashtag (/explore/tags/travel/) URLs, in any mix. Each is read as far as the content above allows; the rest is listed as skipped. Empty (and no usernames or hashtags) = the sample.

## `resultsLimit` (type: `integer`):

Posts or reels per profile or hashtag, comments per post. You pay per result, so this caps the cost of each input. A hashtag can return fewer: the run says so.

## `onlyPostsNewerThan` (type: `string`):

Only posts, reels or comments after this date, e.g. 2026-10-01 or 2 weeks. Times are UTC. Pinned posts can still appear. Empty = no limit.

## `usernames` (type: `array`):

Profiles by username or @handle, e.g. natgeo. Read like profile URLs.

## `hashtags` (type: `array`):

Hashtags without or with #, e.g. travel. Content = Reels finds public reels whose caption holds that exact hashtag; only those are delivered and charged. This isn't Instagram's full top or recent hashtag feed, so a hashtag can return fewer reels than you ask for, and the run says so. Content = Posts skips hashtags.

## `search` (type: `string`):

Words to search reels for, separated by commas, e.g. home workout, yoga. Content = Reels. A topic search: rows name the words in the caption, hashtags or creator name, not always as a hashtag.

## `searchType` (type: `string`):

Search words are read as a topic search of reels (hashtag, the default). Profile and place search aren't supported yet.

## `skipPinnedPosts` (type: `boolean`):

Leave out the posts and reels a profile pinned to its top.

## `sortCommentsBy` (type: `string`):

Comments: newest first (Instagram's own order) or the most liked among the newest 2,000 of each post.

## `maxResults` (type: `integer`):

Stop after this many results in total (all inputs together). You pay per result.

## `includeNestedComments` (type: `boolean`):

Instagram shows replies only to logged-in users, so replies aren't read; accepted so saved inputs run.

## `addParentData` (type: `boolean`):

Accepted for saved inputs of apify/instagram-scraper; every row already says where it came from.

## `searchLimit` (type: `integer`):

Accepted for saved inputs of apify/instagram-scraper; every search word you give is read.

## `proxyConfiguration` (type: `object`):

Leave as is: Apify Proxy (datacenter) reads everything. Where Instagram refuses a datacenter IP, the Actor retries on a little Apify residential on its own, at no extra cost to you.

## Actor input object example

```json
{
  "resultsType": "posts",
  "directUrls": [
    "https://www.instagram.com/natgeo/",
    "https://www.instagram.com/nasa/",
    "https://www.instagram.com/p/DLNsnpUTdVS/"
  ],
  "resultsLimit": 20,
  "searchType": "hashtag",
  "skipPinnedPosts": false,
  "sortCommentsBy": "NEWEST_FIRST",
  "maxResults": 100000,
  "includeNestedComments": false,
  "addParentData": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "resultsType": "posts",
    "directUrls": [
        "https://www.instagram.com/natgeo/",
        "https://www.instagram.com/nasa/",
        "https://www.instagram.com/p/DLNsnpUTdVS/"
    ],
    "resultsLimit": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("deepmine/instagram-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "resultsType": "posts",
    "directUrls": [
        "https://www.instagram.com/natgeo/",
        "https://www.instagram.com/nasa/",
        "https://www.instagram.com/p/DLNsnpUTdVS/",
    ],
    "resultsLimit": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("deepmine/instagram-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "resultsType": "posts",
  "directUrls": [
    "https://www.instagram.com/natgeo/",
    "https://www.instagram.com/nasa/",
    "https://www.instagram.com/p/DLNsnpUTdVS/"
  ],
  "resultsLimit": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call deepmine/instagram-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,deepmine/instagram-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/wUmOKV5HV0IaQ4r4d/builds/b1LklIqjz4hQv49XI/openapi.json
