# Instagram Scraper (`data_minds/instagram-scraper`) Actor

Scrape public Instagram profiles, posts, reels, comments, hashtags and places with no login or cookies. Get followers, bio contacts, likes, plays, captions and media links. Bulk input, auto proxy fallback. Export JSON, CSV or Excel for lead generation and influencer research.

- **URL**: https://apify.com/data_minds/instagram-scraper.md
- **Developed by:** [Data Minds](https://apify.com/data_minds) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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** is an Apify Actor that extracts public Instagram profiles, posts, reels, comments, hashtags, topics and places **with no login or cookies**. Paste links, @usernames, #hashtags or topic keywords and get profile details, bio contacts, likes, plays, captions and media links in separate tables, ready to export as JSON, CSV or Excel. Pricing starts **from $1.40 per 1,000 results on the Gold plan** ($2.00 on the Free plan). [🔍 Try it free](https://apify.com/data_minds/instagram-scraper)

### What can Instagram Scraper do?

- 🚀 **Scrape Instagram in bulk** - add one or hundreds of profile links, @usernames, post and reel links, #hashtags, topic keywords, place links and numeric user ids in one run.
- 👤 **Instagram profile scraper** - Instagram followers count, bio, verified and business flags, category and statistics.
- 📞 **Instagram email scraper and phone number scraper** - public contact details found in bios, links and contact fields.
- 🎬 **Post and reel data** - captions, likes, comments, Instagram video plays, reel play counts, media links, hashtags, mentions and music.
- 💬 **Instagram comments scraper** - comment text, author and time for every post you collect, as separate rows or inside the post.
- 📍 **Instagram location scraper** - place details with address, coordinates and contacts, plus related profiles for every account.
- 🔔 **Monitoring** - a monitoring key returns only posts and comments that earlier runs did not return yet.
- 🎯 **Filters** - date range, post types, minimum likes, comments and plays, caption keywords, pinned posts and paid partnerships.
- 🔌 **Export and integrations** - JSON, CSV, Excel, XML and HTML, plus the Apify API, schedules and webhooks.

#### What data can I extract from Instagram?

Every saved row lands in one results table and also in its own table (Profiles, Posts and reels, Comments, Places, Topics). Each row has a `recordType` field and a `scrapedAt` time.

| Field | Description |
|---|---|
| 👤 `username`, `fullName`, `id`, `url`, `inputUrl` | Account identity, profile link and the input that produced the row. |
| 📝 `biography`, `bioHashtags`, `bioMentions`, `externalUrl`, `bioLinks` | Bio text, hashtags and mentions in the bio, and the links on the profile. |
| 📞 `emails`, `phones`, `whatsapp` | Public contact details found in the bio, links and contact fields. |
| 📈 `followersCount`, `followsCount`, `postsCount`, `postsCountIsApprox` | Audience size and post count (rounded when Instagram shows a figure such as 32K). |
| ✅ `isVerified`, `isPrivate`, `isBusiness`, `accountType`, `category` | Verified badge, privacy, business or creator type and category. |
| 🏢 `address`, `pronouns`, `threadsUsername`, `fbid`, `hasActiveStory`, `isMemorialized` | Extra profile details when shown. |
| 📷 `profilePicUrl`, `profilePicUrlHD` | Profile picture links. |
| 📊 `stats`, `relatedProfiles` | Averages over collected posts (likes, comments, plays, engagement rate, posting rate, top hashtags) and suggested accounts. |
| 🔖 `shortCode`, `type`, `productType`, `isReel`, `isPinned` | Post identity, kind (Image, Video, Sidecar), reel flag and pinned flag. |
| 📄 `caption`, `hashtags`, `mentions`, `captionEdited`, `alt` | Caption text, tags, mentions and Instagram's image description. |
| 💗 `likesCount`, `likesHidden`, `commentsCount`, `videoPlayCount`, `engagementRate` | Engagement numbers; likes are empty when the owner hides them. |
| 🕒 `timestamp`, `takenAtUnix` | Publish time in ISO 8601 (UTC) and unix seconds. |
| 🌄 `displayUrl`, `videoUrl`, `images`, `childPosts`, `width`, `height`, `videoDuration`, `hasAudio` | Media links, carousel items, size and length. |
| 🙋 `ownerUsername`, `ownerId`, `ownerFullName`, `ownerIsVerified`, `ownerFollowersCount` | The post author. |
| 🤝 `coauthors`, `taggedUsers`, `isPaidPartnership`, `sponsors` | Collaborations, tagged accounts and paid partnerships. |
| 🎵 `music`, `location`, `aiLabel`, `aiLabelText`, `commentsDisabled`, `latestComments` | Reel audio, tagged place, AI label, comment switch and embedded comments. |
| 💬 `postShortCode`, `postUrl`, `postOwnerUsername`, `text`, `createdAtUnix`, `likesCount`, `repliesCount`, `parentId`, `isPostOwner`, `isGif`, `gifUrl` | Comment rows: text, time, replies and links. |
| 🙂 `ownerUsername`, `ownerId`, `ownerIsVerified`, `ownerProfilePicUrl` | The commenter on comment rows. |
| 📍 `name`, `slug`, `lat`, `lng`, `city`, `zip`, `phone`, `website`, `priceRange`, `hours`, `postsCount` | Place rows: details, coordinates and contacts. |
| 🔎 `keyword`, `searchType`, `relatedKeywords`, `description`, `descriptionSources`, `searchTerm` | Topic rows for searched hashtags and topics. |
| 🧭 `source`, `dataSource` | Where a row was found (and a source label when you switch it on). |

Rows also carry alias copies of some fields (for example `verified`, `private`, `dimensionsWidth`, `musicInfo`, `locationName`, `locationId`) so the output is easy to swap in for other Instagram tools. Only public data is returned.

### What can you do with the data from Instagram?

**🎯 Find Instagram influencers and vet them**

1. Add creator links to `urls` and keep `resultsType` on Profile details and Posts.
2. Leave `profileStats` on to get average likes, comments, plays, engagement rate and posting frequency per profile.
3. Export the Profiles table to CSV and rank creators by `followersCount` and `stats`.

**🔔 Hashtag monitoring and social media monitoring**

1. Add #hashtags or topic keywords to `urls`, or use `search` with `searchType`.
2. Set `incrementalKey` to a name such as brand-watch and schedule the run daily.
3. Each run returns only posts that earlier runs with the same key have not returned yet.

**📈 Track Instagram followers and run market research**

1. Add the profiles you follow to `urls` and schedule the run weekly.
2. Compare `followersCount` and `postsCount` between runs to track Instagram followers over time.
3. Read `topHashtags` in `stats` to find the top Instagram hashtags in your niche.

**💬 Comment analysis and sentiment analysis**

1. Add post or reel links to `urls` and set `commentsLimit` above 0.
2. Use `commentsNewerThan` to keep recent comments only.
3. Export the Comments table for sentiment analysis or customer research.

**📞 Lead generation from Instagram bios**

1. Add business profile links and pick Profile details.
2. Read `emails`, `phones`, `externalUrl` and `category` from each profile row.
3. Filter the export to rows where `isBusiness` is true.

**📊 Competitor analysis and social media analytics**

1. Add competitor profiles and set `onlyPostsNewerThan` to 30 days to scrape Instagram posts by date.
2. Use `postTypes`, `minLikes` and `captionKeywords` to keep the posts that matter.
3. Compare `likesCount`, `commentsCount` and `engagementRate` across accounts.

### How do I use Instagram Scraper?

1. Open **Instagram Scraper** on Apify and click **Try for free**.
2. Paste links, @usernames, #hashtags or topic keywords into **Instagram links or names** (`urls`).
3. Choose **What to return** (`resultsType`): Profile details, Posts, Reels, Comments or Related profiles.
4. Set **Posts per input** (`resultsLimit`) and **Maximum rows per run** (`maxTotalRecords`).
5. Add optional filters such as dates, post types or minimum likes.
6. Click **Start** and wait for the run to finish.
7. Open the **Output** or **Dataset** tab and export as JSON, CSV or Excel, or call the API.

To scrape public Instagram profiles, use profile links and Profile details. To learn how to scrape Instagram profile feeds, add Posts or Reels. For comments, set `commentsLimit`. To scrape Instagram hashtags, add a #hashtag. To scrape Instagram locations, add a place link. For Instagram data collection in bulk, put many inputs in `urls`.

### How much does it cost to scrape Instagram?

Instagram Scraper uses **pay-per-event** pricing: you pay for each result row saved to the results table, and your plan sets the price. Platform usage is billed in addition.

| Plan | Price per result | Per 1,000 results |
|---|---|---|
| 🆓 Free | $0.002 | $2.00 |
| 🥉 Bronze | $0.0018 | $1.80 |
| 🥈 Silver | $0.0016 | $1.60 |
| 🥇 Gold, Platinum and Diamond | $0.0014 | $1.40 |

Each run also charges a start event of $0.00005 per GB of memory, minimum one. The default memory is 1 GB (1024 MB), so one start event costs $0.00005.

Example: 500 rows on the Bronze plan cost 500 x $0.0018 = $0.90, plus the $0.00005 start event and platform usage. The per-input overview rows are not charged as results, and inputs that fail return no result rows.

#### Is scraping Instagram free?

Instagram Scraper is not free to run: results are billed per saved row by plan, from $2.00 per 1,000 on the Free plan to $1.40 per 1,000 on Gold, Platinum and Diamond. Platform usage is billed in addition. Set a maximum spend per run and the Actor stops cleanly when that limit is reached.

#### How much does Instagram Scraper cost per 1,000 results?

One result is one saved profile, post, reel, comment, place or topic row. 1,000 results cost $2.00 on Free, $1.80 on Bronze, $1.60 on Silver and $1.40 on Gold, Platinum and Diamond, plus the start event and platform usage. Lowering **Maximum rows per run** caps the number of results you can be charged for.

### Input

Instagram Scraper takes a list of Instagram links or names and a choice of what to return. Only `urls` is required; every other field has a default. All inputs below can be mixed in the same run.

#### Scrape profiles, posts and reels by link

Add profile links or @usernames, post and reel links, place links or numeric user ids to `urls`. Profile inputs return the account card and, if selected, its posts, reels, comments and related profiles. Post and reel links always return the post itself.

#### Discover posts by hashtag or topic

Add #hashtags or topic keywords to `urls`, or put one term in `search` and pick `searchType` (Hashtag or Topic keyword). You get the posts for that term and, with Profile details selected, one topic row. Results come in the order Instagram ranks them, not by date.

#### Input fields

| Field | Type | Required | Description | Default / example |
|---|---|---|---|---|
| `urls` | array | Yes | Profile links or @usernames, post and reel links, #hashtags, topic keywords, place links or numeric user ids. | `["https://www.instagram.com/natgeo/"]` |
| `resultsType` | array | No | Profile details, Posts, Reels, Comments, Related profiles. Values: `details`, `posts`, `reels`, `comments`, `relatedProfiles`. | `["details","posts"]` |
| `resultsLimit` | integer | No | Posts or reels to collect for each profile, hashtag, topic or place (1 to 100000). | `10` |
| `commentsLimit` | integer | No | Comments per post (0 to 50000). Above 0 turns comments on; with Comments ticked and 0, it reads 10 per post. | `0` |
| `search` | string | No | Extra hashtag or topic term added to your links. | `street food bangkok` |
| `searchType` | string | No | `hashtag` or `keyword` for the search term. | `hashtag` |
| `onlyPostsNewerThan` | string | No | Keep posts after a date (`2026-01-31`) or a relative value such as `7 days`. Times are UTC; pinned posts may still appear. | empty |
| `onlyPostsOlderThan` | string | No | Keep posts before a date; combine with the field above for a range. | empty |
| `skipPinnedPosts` | boolean | No | Leave out posts pinned to the top of a profile. | `false` |
| `postTypes` | array | No | `image`, `video`, `carousel`, `reel`. Empty keeps all. | empty |
| `minLikes` | integer | No | Keep posts with at least this many likes. | `0` |
| `minComments` | integer | No | Keep posts with at least this many comments. | `0` |
| `minVideoPlays` | integer | No | Keep videos and reels with at least this many plays. | `0` |
| `captionKeywords` | array | No | Keep posts whose caption contains any of these words or phrases. | empty |
| `excludeCaptionKeywords` | array | No | Drop posts whose caption contains any of these words or phrases. | empty |
| `onlyPaidPartnerships` | boolean | No | Keep only posts marked as paid partnerships. | `false` |
| `commentsNewerThan` | string | No | Keep comments after a date or relative value such as `3 days`. | empty |
| `profileStats` | boolean | No | Add averages for likes, comments, plays, engagement rate, posting rate and top hashtags to every profile row. | `true` |
| `addParentData` | boolean | No | Add a `dataSource` field to every post. | `false` |
| `embedCommentsInPosts` | boolean | No | Store comments in each post's `latestComments` instead of the Comments table. | `false` |
| `enrichSearchResults` | boolean | No | Fetch likes, date, tags and music for hashtag, topic and reel results (adds run time). | `true` |
| `enrichOwners` | boolean | No | Read each post author's follower count so engagement rate can be calculated (adds run time). | `true` |
| `addReelPlayCounts` | boolean | No | Fill the play count of reels found in a profile feed. | `true` |
| `playCountLookupPages` | integer | No | How far back to look for older reels' play counts (0 to 100). Higher takes longer. | `10` |
| `includeAltText` | boolean | No | Fill the `alt` field with Instagram's image description (adds run time). | `true` |
| `maxRelatedProfiles` | integer | No | Most related profiles to keep per profile (1 to 100). | `30` |
| `incrementalKey` | string | No | A name such as `brand-watch`. Returns only posts and comments earlier runs with the same name have not returned. | empty |
| `excludeIds` | array | No | Post ids, short codes or comment ids that must never be returned. | empty |
| `maxTotalRecords` | integer | No | Hard stop for the whole run; profiles, posts and comments all count (1 to 1000000). | `1000` |
| `concurrency` | integer | No | Requests at the same time (1 to 10). Lower it if Instagram slows you down. | `4` |
| `requestDelay` | number | No | Pause after each request in seconds (0 to 10). | `0.4` |
| `proxyConfiguration` | object | No | Optional. Choose an Apify proxy or your own if you want requests to go through one. | `{"useApifyProxy": false}` |

Example input:

```json
{
  "urls": [
    "https://www.instagram.com/natgeo/",
    "#travel",
    "https://www.instagram.com/p/EXAMPLE123/"
  ],
  "resultsType": ["details", "posts", "comments"],
  "resultsLimit": 20,
  "commentsLimit": 10,
  "onlyPostsNewerThan": "30 days",
  "postTypes": ["image", "reel"],
  "minLikes": 100,
  "profileStats": true,
  "maxTotalRecords": 500
}
```

### Output

Results go to the Apify Dataset, and you can export them as JSON, CSV, Excel, XML or HTML from the Console or the API. The Output tab shows one table per type: Profiles, Posts and reels, Comments, Places, Topics, an Inputs overview with one row per input, All results (every row in order) and a Run summary.

The Posts table has views for Overview, Engagement, Media, People and tags, Place and music, and Where found. The Profiles table has Overview, Bio and contact, Statistics and Related views.

#### Profile

```json
{
  "recordType": "profile",
  "id": "1000001",
  "username": "example_user",
  "url": "https://www.instagram.com/example_user/",
  "fullName": "Example User",
  "biography": "Travel and food. Contact: hello@example.com",
  "bioHashtags": ["travel"],
  "bioMentions": ["example_friend"],
  "externalUrl": "https://example.com",
  "bioLinks": [{"title": null, "url": "https://example.com"}],
  "emails": ["hello@example.com"],
  "phones": [],
  "whatsapp": [],
  "followersCount": 125000,
  "followsCount": 320,
  "postsCount": 840,
  "postsCountIsApprox": false,
  "isVerified": false,
  "isPrivate": false,
  "isBusiness": true,
  "accountType": "business",
  "category": "Travel",
  "address": null,
  "pronouns": [],
  "profilePicUrl": "https://example.com/pic.jpg",
  "profilePicUrlHD": "https://example.com/pic_hd.jpg",
  "hasActiveStory": false,
  "threadsUsername": null,
  "fbid": null,
  "isMemorialized": false,
  "stats": {"postsAnalyzed": 10, "avgLikes": 4500.5, "avgComments": 120.3, "engagementRate": 3.7},
  "relatedProfiles": [{"username": "example_friend", "id": "1000002", "fullName": "Example Friend", "isVerified": false, "url": "https://www.instagram.com/example_friend/"}],
  "source": {"type": "profile", "value": "example_user"},
  "scrapedAt": "2026-10-17T10:00:00.000Z",
  "inputUrl": "https://www.instagram.com/example_user/"
}
```

#### Post or reel

```json
{
  "recordType": "post",
  "id": "3800000000000000000",
  "shortCode": "EXAMPLE123",
  "url": "https://www.instagram.com/reel/EXAMPLE123/",
  "type": "Video",
  "productType": "clips",
  "isReel": true,
  "caption": "Sunset by the sea #travel",
  "hashtags": ["travel"],
  "mentions": [],
  "timestamp": "2026-09-10T12:00:00.000Z",
  "takenAtUnix": 1789000000,
  "isPinned": false,
  "likesCount": 4800,
  "likesHidden": false,
  "commentsCount": 130,
  "videoPlayCount": 52000,
  "videoDuration": 30.5,
  "engagementRate": 3.9,
  "displayUrl": "https://example.com/post.jpg",
  "videoUrl": "https://example.com/post.mp4",
  "images": ["https://example.com/post.jpg"],
  "childPosts": [],
  "width": 1080,
  "height": 1920,
  "alt": "Photo of a beach at sunset.",
  "ownerUsername": "example_user",
  "ownerId": "1000001",
  "ownerFullName": "Example User",
  "ownerIsVerified": false,
  "ownerFollowersCount": 125000,
  "coauthors": [],
  "taggedUsers": [],
  "isPaidPartnership": false,
  "sponsors": [],
  "music": {"title": "Original audio", "artist": "example_user", "isOriginalAudio": true},
  "location": {"id": "213385402", "name": "Example Beach", "city": "Example City"},
  "captionEdited": false,
  "commentsDisabled": false,
  "hasAudio": true,
  "aiLabel": false,
  "latestComments": [],
  "source": {"type": "profile", "value": "example_user"},
  "scrapedAt": "2026-10-17T10:00:00.000Z",
  "inputUrl": "https://www.instagram.com/example_user/"
}
```

#### Comment

```json
{
  "recordType": "comment",
  "id": "18000000000000000",
  "postShortCode": "EXAMPLE123",
  "postUrl": "https://www.instagram.com/reel/EXAMPLE123/",
  "postOwnerUsername": "example_user",
  "text": "Great shot!",
  "hashtags": [],
  "mentions": [],
  "timestamp": "2026-09-10T13:00:00.000Z",
  "createdAtUnix": 1789003600,
  "likesCount": null,
  "repliesCount": null,
  "parentId": null,
  "ownerUsername": "example_fan",
  "ownerId": "1000003",
  "ownerIsVerified": false,
  "ownerProfilePicUrl": "https://example.com/pic.jpg",
  "isPostOwner": false,
  "isGif": false,
  "gifUrl": null,
  "scrapedAt": "2026-10-17T10:00:00.000Z",
  "inputUrl": "https://www.instagram.com/p/EXAMPLE123/"
}
```

#### Place and topic

```json
{
  "recordType": "location",
  "id": "213385402",
  "name": "Example City",
  "slug": "example-city",
  "url": "https://www.instagram.com/explore/locations/213385402/example-city",
  "category": null,
  "lat": 40.71,
  "lng": -74.0,
  "address": null,
  "city": "Example City",
  "zip": null,
  "phone": null,
  "website": null,
  "priceRange": null,
  "postsCount": 12000000,
  "hours": null,
  "source": {"type": "location", "value": "213385402"},
  "scrapedAt": "2026-10-17T10:00:00.000Z",
  "inputUrl": "https://www.instagram.com/explore/locations/213385402/"
}
```

```json
{
  "recordType": "keyword",
  "keyword": "travel",
  "url": "https://www.instagram.com/popular/travel/",
  "relatedKeywords": ["travel photography"],
  "description": null,
  "descriptionSources": null,
  "searchType": "hashtag",
  "searchTerm": "travel",
  "scrapedAt": "2026-10-17T10:00:00.000Z",
  "inputUrl": "#travel"
}
```

#### Inputs overview and run summary

The Inputs overview table has one row per input with `input`, `kind`, `value`, `status`, `rowsSaved`, `error`, `errorDescription`, `notes` and `seconds`. Failed inputs are listed there with a plain reason. The run summary record (`SUMMARY`) holds `finishedAt`, `rows`, `rowsByType`, `durationSeconds`, `stoppedBecause`, `inputs` and `notices`.

#### Notes and limitations

- Only public data is returned; private profiles return the profile card but no posts, reels or comments.
- Instagram shows visitors without an account only part of a post's comments, and no like or reply counts, so `likesCount` and `repliesCount` on comments are usually empty.
- `likesCount` is empty when the owner hides likes (`likesHidden` is true).
- Hashtag and topic searches return posts in Instagram's ranking, only for terms that have a public results page, and are not chronological.
- Place details are returned, but posts for a place are often not available without an account.
- Play counts of older reels can stay empty; raise `playCountLookupPages` to look further back.
- Date and like filters on hashtag, topic and reel results need `enrichSearchResults` switched on.
- Profile feeds stop at the deepest post Instagram shows to visitors.
- `maxTotalRecords` counts profiles, posts and comments together, so raise it when you collect many comments.

### FAQ

#### Is it legal to scrape Instagram?

Instagram Scraper collects publicly visible data only, but laws such as GDPR and CCPA, and Instagram's terms, still apply to how you use personal data. This is not legal advice. Read [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/) and ask a lawyer if you are unsure about your use case.

#### Can you scrape Instagram without login, cookies or an API key?

Yes. Instagram Scraper works without an Instagram account, login, cookies or Instagram API key, and you only need an Apify account to run it. Because it reads what any visitor can see, private profiles and content that Instagram hides from visitors are not available, and some fields stay empty.

#### How many results can I get per run?

Set **Posts per input** (`resultsLimit`, default 10, up to 100000) for each profile, hashtag, topic or place. **Maximum rows per run** (`maxTotalRecords`, default 1000, up to 1,000,000) stops the whole run, counting profiles, posts and comments together. Raise both when you need larger exports, and check results on a small run first.

#### Can I export Instagram data to CSV or Excel?

Yes. Every run saves rows to an Apify Dataset. Open the Output or Dataset tab and export as JSON, CSV, Excel, XML or HTML, or download the data through the API. Each table (Profiles, Posts and reels, Comments, Places, Topics) can be exported on its own, which keeps spreadsheets clean and easy to filter.

#### Can I schedule runs or use webhooks and integrations?

Yes. Use Apify schedules to run Instagram Scraper hourly, daily or weekly, and webhooks to start other tasks when a run finishes. Apify integrations let you send results to tools such as Make, n8n or Zapier. Combine a schedule with `incrementalKey` to receive only new posts and comments on every run.

#### Can I use Instagram Scraper with the Apify API or an MCP server?

Yes. You can start runs and read results from your own code through the Apify API, and AI assistants can call the Actor through Apify's MCP server. See the [Apify API documentation](https://docs.apify.com/api/v2) for the endpoints, clients and authentication, and the API tab of this Actor for ready-made examples.

#### Is Instagram Scraper an Instagram API alternative?

For public data, yes: it needs no developer app, token or approval, and it returns profiles, posts, reels, comments, places and topics as JSON, CSV or Excel. It reads public pages only, so it cannot publish, send messages or read private accounts. Some figures, such as comment likes, may be empty.

#### Why am I getting fewer results than expected?

Common causes are a low **Posts per input**, a filter that removes posts (the Inputs overview `notes` show which one), a private profile, or Instagram showing visitors only part of a feed or comment list. Raise `resultsLimit`, loosen filters, switch on `enrichSearchResults` for date filters, and raise `maxTotalRecords`.

#### Instagram Scraper not working?

Check the run log and the Inputs overview table first: each failed input has an `errorDescription`, such as a profile that does not exist or is unavailable. If a valid public input still fails, open the **Issues** tab with your input and run link, and we will look into it. Lowering `concurrency` can also help when Instagram slows requests.

### Related Actors

| Actor | Use it to |
|---|---|
| 🎬 [Facebook Reels Scraper](https://apify.com/data_minds/facebook-reels-scraper) | Scrape Facebook Reels from public pages, profiles or reel URLs: captions, play counts, reactions, comments and video links. |
| 📘 [Facebook Pages Scraper](https://apify.com/data_minds/facebook-pages-scraper) | Scrape public Facebook Page data in bulk: category, followers, email, phone, website and address. |
| 💭 [YouTube Comments Scraper](https://apify.com/data_minds/youtube-comments-scraper) | Extract YouTube video comments and replies with author, text, likes and publish date. |
| 🎥 [YouTube Shorts Scraper](https://apify.com/data_minds/youtube-shorts-scraper) | Extract YouTube Shorts from any channel: views, likes, comments and hashtags. |

### Support and disclaimer

Found a bug or need a feature? Open an issue in the **Issues** tab. For custom solutions, integrations or questions, contact hello.dataminds@gmail.com. Instagram Scraper is independent and not affiliated with Instagram or Meta; trademarks belong to their owners. It collects publicly available data, and you are responsible for complying with applicable laws and the terms of [Instagram](https://www.instagram.com/).

*Last updated: 2026-10-17*

# Actor input Schema

## `urls` (type: `array`):

Add one or hundreds, and mix them freely: profile links or @usernames, post and reel links, #hashtags or hashtag links, topic keywords, place links, or numeric user ids. Examples: https://www.instagram.com/natgeo/ , @natgeo , #travel , street food bangkok.

## `resultsType` (type: `array`):

Profile details returns the account card. Posts and Reels return their feeds. Comments adds the comments of every post collected. Related profiles adds the accounts Instagram suggests. Post links always return the post itself.

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

How many posts or reels to collect for each profile, hashtag, topic or place.

## `commentsLimit` (type: `integer`):

How many comments to collect for every post. Any number above 0 turns comments on by itself. 0 collects none, unless Comments is ticked above (then 10 per post). Instagram shows visitors who are not logged in only part of a post's comments, and no like or reply counts.

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

Optional extra search term added to your links. Use a hashtag such as travel or a topic such as street food bangkok.

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

Whether the search term above is a hashtag or a topic keyword.

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

Keep posts published after this date. Pick a date, or type a relative value such as 7 days, 2 months or 1 year. Times are UTC. Pinned posts may still appear. Leave empty for no limit.

## `onlyPostsOlderThan` (type: `string`):

Keep posts published before this date. Same formats as 'Posts newer than'; use both for a date range. Leave empty for no limit.

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

Leave out posts pinned to the top of a profile.

## `postTypes` (type: `array`):

Keep only these kinds of posts. Leave empty for all.

## `minLikes` (type: `integer`):

Keep only posts with at least this many likes. 0 keeps all.

## `minComments` (type: `integer`):

Keep only posts with at least this many comments. 0 keeps all.

## `minVideoPlays` (type: `integer`):

Keep only videos and reels with at least this many plays. 0 keeps all.

## `captionKeywords` (type: `array`):

Keep only posts whose caption contains any of these words or phrases. Leave empty to keep all.

## `excludeCaptionKeywords` (type: `array`):

Drop posts whose caption contains any of these words or phrases.

## `onlyPaidPartnerships` (type: `boolean`):

Keep only posts marked as a paid partnership.

## `commentsNewerThan` (type: `string`):

Keep comments posted after this date. Pick a date, or type a relative value such as 3 days or 1 month. Leave empty for no limit.

## `profileStats` (type: `boolean`):

Add averages for likes, comments, plays, engagement rate, posting cadence and top hashtags to every profile row.

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

Add a dataSource field to every post: profile for profile posts, hashtag for hashtag posts, keyword, location or post.

## `embedCommentsInPosts` (type: `boolean`):

Store the comments in each post's latestComments field instead of as separate rows in the Comments table.

## `enrichSearchResults` (type: `boolean`):

Hashtag, topic and reel results arrive with few fields. Switch on to fetch likes, date, tags and music for each (adds run time for every post).

## `enrichOwners` (type: `boolean`):

Read the follower count of each post author so engagement rate can be calculated for hashtag, topic, single-post and collaboration posts (adds run time for every author).

## `addReelPlayCounts` (type: `boolean`):

Fill the play count of reels found in a profile feed.

## `playCountLookupPages` (type: `integer`):

How far back to look for the play count of older reels that have none yet. Higher values take longer.

## `includeAltText` (type: `boolean`):

Fill the alt field with Instagram's image description (adds run time).

## `maxRelatedProfiles` (type: `integer`):

Most related profiles to keep for each profile. Used when Related profiles is selected.

## `incrementalKey` (type: `string`):

Give a name such as brand-watch to return only posts and comments that earlier runs with the same name have not returned yet. Leave empty to return everything every time.

## `excludeIds` (type: `array`):

Post ids, short codes or comment ids that must never be returned.

## `maxTotalRecords` (type: `integer`):

Hard stop for the whole run (profiles, posts and comments together). Comments count as rows, so raise it when you ask for many comments per post.

## `concurrency` (type: `integer`):

How many requests run at the same time. Lower it if Instagram slows you down.

## `requestDelay` (type: `number`):

Pause after each request in seconds. A little random variation is added.

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

Optional. Choose an Apify proxy or your own proxy if you want requests to go through one. Leave the default if you do not need it.

## Actor input object example

```json
{
  "urls": [
    "https://www.instagram.com/natgeo/"
  ],
  "resultsType": [
    "details",
    "posts"
  ],
  "resultsLimit": 10,
  "commentsLimit": 10,
  "searchType": "hashtag",
  "skipPinnedPosts": false,
  "minLikes": 0,
  "minComments": 0,
  "minVideoPlays": 0,
  "onlyPaidPartnerships": false,
  "profileStats": true,
  "addParentData": false,
  "embedCommentsInPosts": false,
  "enrichSearchResults": true,
  "enrichOwners": true,
  "addReelPlayCounts": true,
  "playCountLookupPages": 10,
  "includeAltText": true,
  "maxRelatedProfiles": 30,
  "maxTotalRecords": 1000,
  "concurrency": 4,
  "requestDelay": 0.4,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `profiles` (type: `string`):

Followers, bio, contact details, statistics and related profiles per account.

## `posts` (type: `string`):

Captions, likes, comments, plays, media links, tags, places and music.

## `comments` (type: `string`):

Comment text, author, likes, replies and time per post.

## `locations` (type: `string`):

Place details: address, coordinates, contacts and post count.

## `keywords` (type: `string`):

Searched hashtags and topics with related topics.

## `sources` (type: `string`):

One row per input: status, rows saved and what went wrong.

## `all` (type: `string`):

Every saved row in the order it was found, all types together.

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

Totals for the whole run.

# 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 = {
    "urls": [
        "https://www.instagram.com/natgeo/"
    ],
    "resultsType": [
        "details",
        "posts"
    ],
    "commentsLimit": 10,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("data_minds/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 = {
    "urls": ["https://www.instagram.com/natgeo/"],
    "resultsType": [
        "details",
        "posts",
    ],
    "commentsLimit": 10,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("data_minds/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 '{
  "urls": [
    "https://www.instagram.com/natgeo/"
  ],
  "resultsType": [
    "details",
    "posts"
  ],
  "commentsLimit": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call data_minds/instagram-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,data_minds/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/hwFlvEAZggUojoZER/builds/NUFNmbmrDjq4ezbmd/openapi.json
