# Instagram Scraper - Profiles, Posts & Reels (`benthepythondev/instagram-intelligence-scraper`) Actor

Returns public Instagram profiles, posts, reels and the comments under posts, without a login: full captions, UTC dates, engagement counts and up to 100 comments per post. Filter posts by date and bound the pages read. A profile or post that does not exist is not charged.

- **URL**: https://apify.com/benthepythondev/instagram-intelligence-scraper.md
- **Developed by:** [Ben](https://apify.com/benthepythondev) (community)
- **Categories:** Social media, Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 172 total users, 9 monthly users, 97.2% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 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: Public Profiles, Posts and Reels

Read public Instagram profiles, timelines and post comments with source captions, timestamps and engagement fields. Filter posts by inclusive UTC dates and inspect how far the run paginated. Export to JSON, CSV or Excel, run on an Apify schedule, call via API, or connect to Make, Zapier or n8n.

**Public data, clear limits:** the modes `profile`, `posts`, `reels` and `comments` read public data without a login. Follower and following lists, hashtag pages, search and stories are shown by Instagram to signed-in users only: without your own session cookie those modes end with no results, and no result is charged. Free-plan result events cost **$2.50 per 1,000 records**, plus the start event described in Pricing.

### Quick start

Start with a tested example for dated public NASA posts:

- [NASA Instagram posts since September 1, 2026](https://apify.com/benthepythondev/instagram-intelligence-scraper/examples/nasa-instagram-posts-september-2026)

Open the example and choose **Try for free** to copy its input into your account. Check the input and set a maximum run charge before starting; Actor fees still follow the pricing below. When the run finishes, open the run's dataset and select the **Overview** view and download JSON for nested fields or CSV/Excel for a table.

| Your goal | Input to use |
|---|---|
| Inspect an account | `mode: profile` and its public username |
| Collect public posts in a date window | `mode: posts`, UTC dates and page/result caps |
| Read what people wrote under posts | `mode: comments` and the post links in `postUrls` |

The [real output example](#example-output) shows the record shape. The [Python workflow](#python-api-workflow) saves your own export to a local JSON file with a $0.05 maximum Actor charge.

### What it extracts

The public HTTP route supports `profile`, `posts`, `reels` and `comments`. It reads Instagram's public web data without requiring a login cookie. A profile result must match the requested username and contain useful public information before the Actor accepts it. Posts retain their stable shortcode and complete source caption rather than truncating the caption at 2,000 characters.

Profiles can contain the displayed name, biography, website, follower/following counts, post count, verification status, profile image and public business contact fields. Optional contact extraction uses published profile data and bio text; it does not verify email deliverability or uncover private contacts.

Post and reel rows contain caption, like/comment counts, source timestamp, shortcode, post URL, image/video URLs, hashtags and mentions where the public source supplies them. A reel uses its `/reel/` source URL. Media URLs can expire. Logged-out visibility is often narrower than the grid shown to a logged-in person, so a profile's advertised post count is not a guarantee of the number retrievable from its public timeline.

### Input

| Field | Behavior |
|---|---|
| `mode` | `profile`, `posts`, `reels` or `comments` without a login. `followers`, `following`, `hashtag`, `search` and `stories` need `sessionCookie`. |
| `username` | A handle, @handle or public profile URL. Default: instagram. |
| `maxResults` | Maximum exported rows. Public modes accept 1–1,000; default is two. In comments mode it is the number of posts read. |
| `postUrls` | Post or reel links for the comments mode. |
| `maxCommentsPerPost` | Comments per post in comments mode, up to 100; default 50. |
| `maxPages` | Maximum source timeline pages, 1–50; default five. Applies to public posts/reels. |
| `postedAfter`, `postedBefore` | Inclusive YYYY-MM-DD UTC dates. Public posts/reels only, with `useInstagrapi=false`. |
| `includeEngagement` | Add a post engagement count or an available public profile sample rate. |
| `includeSentiment` | Optional keyword-based positive/negative/neutral label. |
| `includeLeadScore` | Optional rule-based profile score, 0–100. |
| `extractEmails`, `extractPhones` | Include contacts published in the profile or its bio. |
| `minFollowers`, `maxFollowers`, `verifiedOnly` | Filter the public profile before exporting profile or timeline rows. |
| `sessionCookie` | The `sessionid` cookie of your own signed-in session, for the five modes that need one. Use only access you are authorized to use. |
| `useInstagrapi` | Legacy authenticated route; keep false for the documented public date-filter workflow. |

#### Example input: September NASA posts

```json
{
  "mode": "posts",
  "username": "nasa",
  "postedAfter": "2026-09-01",
  "maxResults": 3,
  "maxPages": 2,
  "includeEngagement": false,
  "includeSentiment": false,
  "useInstagrapi": false
}
```

The date filter applies to the source timestamp, converted to UTC. It includes the start and end dates. Missing or unparseable post timestamps do not pass an active date filter. An invalid calendar date, reversed date range or date filter used with another mode fails validation before network requests.

Pagination keeps scanning within `maxPages` when early rows are outside the requested date range. This matters for pinned posts and mixed-age timelines. It removes duplicate shortcodes across pages and retry routes, detects repeated source cursors and respects the run's charge cap. The number returned can be below `maxResults` when the public timeline ends or a filter removes records.

### Example output

One complete record from a verified September 9, 2026 cloud run. Values and public media URLs can change or expire; this is a dated sample.

```json
{
  "username": "nasa",
  "url": "https://www.instagram.com/p/DdEy97xj9P-/",
  "shortcode": "DdEy97xj9P-",
  "caption": "Some things are worth repeating 📸\n\nLike observing a galaxy cluster! This image of the cluster Abell S0740 was created by combining several @NASAHubble science observations. Hubble's multiple looks at the cluster revealed a diverse collection of galaxies including a giant, bright elliptical galaxy just off center. That galaxy is as massive as 100 billion of our Suns, by the way.\n \nCredit: NASA\n\n#NASA #Hubble #Stars",
  "likes": 67867,
  "comments_count": 247,
  "timestamp": "2026-09-09T17:27:34+00:00",
  "images": [
    "https://scontent-ord5-1.cdninstagram.com/v/t51.82787-15/801962799_18646148242049152_8221282425578912411_n.jpg?stp=dst-jpg_e35_tt6&_nc_cat=1&ig_cache_key=Mzk4MjUzMjEyODg5ODI3NDMwMg%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkZFRUQueHBpZHMuNzE5LnNkci5yZWd1bGFyX3Bob3RvLkMzIn0%3D&_nc_ohc=jbFgdr3Pvs4Q7kNvwHusEMy&_nc_oc=Adrui-Y6wz_HWK-EM2wgrjsLVQhWvlQphht5CAUXLclqov2QcXhw7DB_Pw9rAvdGjfk&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-ord5-1.cdninstagram.com&_nc_gid=g1JC2NlYH0UmfsMVmxvu_A&_nc_ss=7a22e&oh=00_AQL1_e3AEwdyHPwo6Gw14N0ckYxlte0pZkxM0ZSU_1iIRA&oe=6AA79387",
    "https://scontent-ord5-1.cdninstagram.com/v/t51.82787-15/801962799_18646148242049152_8221282425578912411_n.jpg?stp=dst-jpg_e35_p640x640_sh2.08_tt6&_nc_cat=1&ig_cache_key=Mzk4MjUzMjEyODg5ODI3NDMwMg%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkZFRUQueHBpZHMuNzE5LnNkci5yZWd1bGFyX3Bob3RvLkMzIn0%3D&_nc_ohc=jbFgdr3Pvs4Q7kNvwHusEMy&_nc_oc=Adrui-Y6wz_HWK-EM2wgrjsLVQhWvlQphht5CAUXLclqov2QcXhw7DB_Pw9rAvdGjfk&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-ord5-1.cdninstagram.com&_nc_gid=g1JC2NlYH0UmfsMVmxvu_A&_nc_ss=7a22e&oh=00_AQL0vxzE8MG20C_CtFgyj1KKQ0LoMQkYfDwtAUDUzemeBw&oe=6AA79387",
    "https://scontent-ord5-1.cdninstagram.com/v/t51.82787-15/801962799_18646148242049152_8221282425578912411_n.jpg?stp=dst-jpg_e35_p480x480_tt6&_nc_cat=1&ig_cache_key=Mzk4MjUzMjEyODg5ODI3NDMwMg%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkZFRUQueHBpZHMuNzE5LnNkci5yZWd1bGFyX3Bob3RvLkMzIn0%3D&_nc_ohc=jbFgdr3Pvs4Q7kNvwHusEMy&_nc_oc=Adrui-Y6wz_HWK-EM2wgrjsLVQhWvlQphht5CAUXLclqov2QcXhw7DB_Pw9rAvdGjfk&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-ord5-1.cdninstagram.com&_nc_gid=g1JC2NlYH0UmfsMVmxvu_A&_nc_ss=7a22e&oh=00_AQLC8eWglY4JryDA8PM0naJPvTposWCFXtqnTaCxHqn0UA&oe=6AA79387",
    "https://scontent-ord5-1.cdninstagram.com/v/t51.82787-15/801962799_18646148242049152_8221282425578912411_n.jpg?stp=dst-jpg_e35_p320x320_tt6&_nc_cat=1&ig_cache_key=Mzk4MjUzMjEyODg5ODI3NDMwMg%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkZFRUQueHBpZHMuNzE5LnNkci5yZWd1bGFyX3Bob3RvLkMzIn0%3D&_nc_ohc=jbFgdr3Pvs4Q7kNvwHusEMy&_nc_oc=Adrui-Y6wz_HWK-EM2wgrjsLVQhWvlQphht5CAUXLclqov2QcXhw7DB_Pw9rAvdGjfk&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-ord5-1.cdninstagram.com&_nc_gid=g1JC2NlYH0UmfsMVmxvu_A&_nc_ss=7a22e&oh=00_AQLMYHLyfpgNPS1o0L_ZxJ-zKoL94DCmL1H4DlNR3pru6Q&oe=6AA79387",
    "https://scontent-ord5-1.cdninstagram.com/v/t51.82787-15/801962799_18646148242049152_8221282425578912411_n.jpg?stp=dst-jpg_e35_p240x240_tt6&_nc_cat=1&ig_cache_key=Mzk4MjUzMjEyODg5ODI3NDMwMg%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkZFRUQueHBpZHMuNzE5LnNkci5yZWd1bGFyX3Bob3RvLkMzIn0%3D&_nc_ohc=jbFgdr3Pvs4Q7kNvwHusEMy&_nc_oc=Adrui-Y6wz_HWK-EM2wgrjsLVQhWvlQphht5CAUXLclqov2QcXhw7DB_Pw9rAvdGjfk&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-ord5-1.cdninstagram.com&_nc_gid=g1JC2NlYH0UmfsMVmxvu_A&_nc_ss=7a22e&oh=00_AQKqItyV7EnevD-rq5i0oXf1CDOSdxRzf9RPjM1pYAPitg&oe=6AA79387",
    "https://scontent-ord5-1.cdninstagram.com/v/t51.82787-15/801962799_18646148242049152_8221282425578912411_n.jpg?stp=c0.40.719.719a_dst-jpg_e35_s719x719_tt6&_nc_cat=1&ig_cache_key=Mzk4MjUzMjEyODg5ODI3NDMwMg%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkZFRUQueHBpZHMuNzE5LnNkci5yZWd1bGFyX3Bob3RvLkMzIn0%3D&_nc_ohc=jbFgdr3Pvs4Q7kNvwHusEMy&_nc_oc=Adrui-Y6wz_HWK-EM2wgrjsLVQhWvlQphht5CAUXLclqov2QcXhw7DB_Pw9rAvdGjfk&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-ord5-1.cdninstagram.com&_nc_gid=g1JC2NlYH0UmfsMVmxvu_A&_nc_ss=7a22e&oh=00_AQIwhStSSVysTH6dZG32AT8rMWvQI9ZRvIwvO4rCe3uFoQ&oe=6AA79387",
    "https://scontent-ord5-1.cdninstagram.com/v/t51.82787-15/801962799_18646148242049152_8221282425578912411_n.jpg?stp=c0.40.719.719a_dst-jpg_e35_s719x719_tt6&_nc_cat=1&ig_cache_key=Mzk4MjUzMjEyODg5ODI3NDMwMg%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkZFRUQueHBpZHMuNzE5LnNkci5yZWd1bGFyX3Bob3RvLkMzIn0%3D&_nc_ohc=jbFgdr3Pvs4Q7kNvwHusEMy&_nc_oc=Adrui-Y6wz_HWK-EM2wgrjsLVQhWvlQphht5CAUXLclqov2QcXhw7DB_Pw9rAvdGjfk&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-ord5-1.cdninstagram.com&_nc_gid=g1JC2NlYH0UmfsMVmxvu_A&_nc_ss=7a22e&oh=00_AQIwhStSSVysTH6dZG32AT8rMWvQI9ZRvIwvO4rCe3uFoQ&oe=6AA79387",
    "https://scontent-ord5-1.cdninstagram.com/v/t51.82787-15/801962799_18646148242049152_8221282425578912411_n.jpg?stp=c0.40.719.719a_dst-jpg_e35_s640x640_sh2.08_tt6&_nc_cat=1&ig_cache_key=Mzk4MjUzMjEyODg5ODI3NDMwMg%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkZFRUQueHBpZHMuNzE5LnNkci5yZWd1bGFyX3Bob3RvLkMzIn0%3D&_nc_ohc=jbFgdr3Pvs4Q7kNvwHusEMy&_nc_oc=Adrui-Y6wz_HWK-EM2wgrjsLVQhWvlQphht5CAUXLclqov2QcXhw7DB_Pw9rAvdGjfk&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-ord5-1.cdninstagram.com&_nc_gid=g1JC2NlYH0UmfsMVmxvu_A&_nc_ss=7a22e&oh=00_AQLPVV8wzxoPzSxNeQEr4hOZKMaCJWbeTgMkp4D4wOawuA&oe=6AA79387"
  ],
  "videos": [],
  "hashtags": [
    "NASA",
    "Hubble",
    "Stars"
  ],
  "mentions": [
    "NASAHubble"
  ],
  "is_video": false,
  "product_type": "feed",
  "scraped_at": "2026-09-09T19:30:46.098676+00:00"
}
```

The dataset also includes `caption`, `images`, `videos`, `hashtags`, `mentions`, `product_type` and `scraped_at` for the public post route. Optional post fields are `engagement_score` and `sentiment`; reels add `type`. Profile fields differ from post fields, so use JSON when preserving all source attributes matters, or select the columns needed for a spreadsheet.

The run's `SUMMARY` key-value record reports processed items, fetched timeline pages, duplicate posts, date-filtered posts and the stop reason. `result_limit`, `page_limit`, `time_limit` and `charge_limit` describe bounded results; `login_required`, `session_not_accepted` and `missing_input` describe a run that had nothing to read. `public_timeline_exhausted` means the public source connection ended, not that every post visible to every logged-in account was available. A valid filter can produce no rows.

The Actor requests the profile directly first. If Instagram answers with its login page, it retries through up to three fresh US residential exits. When Instagram itself says the profile is not available, and a second exit gets the same answer, the run finishes successfully with zero rows, a status message and the stop reason `profile_not_found`. Check the spelling in that case; the account may also have been renamed, removed or made visible only after login. A private account returns its profile row but no posts.

If Instagram stops answering after some posts were saved, those rows stay in the dataset and the run ends with the stop reason `source_unavailable`. A run fails only when no exit could load the profile at all. It never treats an unrelated profile as a successful result.

### Metrics and pricing

The post engagement score is likes plus twice the comment count. The optional profile rate is mean likes from an available public sample divided by follower count, expressed as a percentage. An unavailable sample leaves the optional rate absent. These observations are not audience-growth measurements or evidence of genuine engagement. Lead scoring and sentiment are simple rules, not trained predictions.

Established pricing remains unchanged: Free is **$0.0025 per exported result**, or **$2.50 per 1,000**, plus the existing start event of $0.00005 per GB with a minimum of one. Bronze is $2.25/1,000, Silver $2.125, Gold $2.00, Platinum $1.875 and Diamond $1.75. The Store pricing panel and actual run usage are authoritative. Optional proxy use affects resource usage; a spending cap can reduce the exported count.

### Comments

`mode: comments` reads the comments under the posts and reels you list in `postUrls`, through the call Instagram's own post page makes for a visitor. It uses no login and no browser. You get one result per post:

```json
{
  "post_url": "https://www.instagram.com/p/DdG4RIxIPyf/",
  "comments": [
    {
      "username": "example_user",
      "text": "Really great",
      "timestamp": "2026-10-04T19:59:21+00:00",
      "likes": 0,
      "sentiment": "positive",
      "id": "18173697571459777",
      "is_verified": false
    }
  ],
  "comments_count": 50,
  "post_comment_count": 528,
  "scraped_at": "2026-10-05T08:06:48.706512+00:00"
}
```

The sample is from a cloud run of October 5, 2026, cut to one comment whose author and wording are replaced here. `comments_count` is the number of comments in this result. `post_comment_count` is the number the post itself reports, and that one includes replies: Instagram lists top-level comments to visitors, so the two differ. `maxCommentsPerPost` sets how many you get per post, 50 by default and 100 at most. `maxResults` is the number of posts read, so raise it when you list more than two links; the status message says how many links were left out.

A link that leads to no public post, and a post that shows visitors no comment, give no result and no charge; the status message and the `SUMMARY` record name them. In that run, 50 comments of one post took 6 seconds, and a second link that led to no post added 5 seconds and no charge.

For whole comment lists with one row per comment, use the [Instagram Comments Scraper](https://apify.com/benthepythondev/instagram-comments-scraper).

### Modes that need your own session

Instagram shows follower and following lists, hashtag pages, search results and stories to signed-in users only. The modes `followers`, `following`, `hashtag`, `search` and `stories` therefore read nothing unless `sessionCookie` holds the `sessionid` cookie of your own signed-in browser session. Without it, or when Instagram does not accept it, the run ends successfully with zero results, a status message that says why, and the stop reason `login_required` or `session_not_accepted` in `SUMMARY`. No result is charged.

With a session these modes open a browser. They were not verified in this release, the date filters are rejected on them, and this page does not promise a complete follower list, exhaustive keyword search or a Stories archive. The input also keeps an optional authenticated library path (`useInstagrapi`), which was not verified either.

### Python API workflow

Copy the first input JSON above into `input.json` and save this code as `export.py`. In a Python virtual environment, install `apify-client` with `python -m pip install apify-client`. Set `APIFY_TOKEN` to your own Apify token in your environment, then run `python export.py`. Keep the token out of source files and shared screenshots.

```python
import json
import os
from decimal import Decimal
from pathlib import Path

from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("benthepythondev/instagram-intelligence-scraper").call(
    run_input=json.loads(Path("input.json").read_text(encoding="utf-8")),
    max_total_charge_usd=Decimal("0.05"),
    memory_mbytes=1024,
    timeout_secs=300,
)
if not run or run["status"] != "SUCCEEDED":
    raise RuntimeError(f"Inspect the run before retrying: {run and run['id']}")

rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())
Path("nasa-instagram-posts.json").write_text(
    json.dumps(rows, ensure_ascii=False, indent=2), encoding="utf-8"
)
print(f"Saved {len(rows)} records from run {run['id']}")
```

This starts a run in your account, waits for completion and saves `nasa-instagram-posts.json`. The $0.05 limit bounds Actor charges; it is not a promised bill or result count. Check the printed run ID and server log if the result is shorter than expected. If your client loses its connection, inspect the existing run in Console before starting another one. See the [official Python client](https://docs.apify.com/api/client/python/) for other run options.

Use `shortcode` as the post key and retain the complete `caption` and UTC `timestamp`. Upsert by shortcode to avoid duplicate posts, or keep `scraped_at` for an observation history. Scheduling does not create a complete timeline archive; public visibility and scan bounds still apply.

For recurring runs without writing a scheduler, copy a tested public Task into your account and attach an Apify Schedule to that copy. Keep its maximum-charge limit and avoid overlapping runs when using monitor state. The Python example above is also suitable for an existing scheduler; run it from the directory containing `input.json` and provide the token through that scheduler's secret settings.

### FAQ

**Can I get every post from a profile?** Only posts exposed by the public timeline within the page, time and result bounds. Logged-in counts can be higher.

**Why can a recent-date search return fewer rows?** The Actor filters actual source dates. Old or pinned content can fill part of the scanned window, and the public timeline may expose only a subset.

**Are captions complete?** The public timeline caption is kept without the previous 2,000-character truncation. This does not add text missing from Instagram's own response.

**Does the date filter apply to comments or follower lists?** No. It applies to public post/reel timestamps and rejects other mode combinations.

**Will retries charge duplicate posts?** Successful shortcode exports are tracked within the run and excluded on a retry. As with any interrupted export, use shortcodes to reconcile partial datasets downstream.

**Does it need my Instagram password?** No. Profile, posts, reels and comments need no login at all. Five further modes need the session cookie of your own signed-in session; see [Modes that need your own session](#modes-that-need-your-own-session).

**Why are there fewer comments than the post shows?** The post's count includes replies, and Instagram lists only top-level comments to visitors. This Actor returns up to 100 of them per post.

**What changed in the comments, search, hashtag, follower and stories modes on October 5, 2026?** Before, these modes opened a browser without a login and could save and charge results that held no data: an empty comment list, links of Instagram's login page, a "no stories" row. Now comments come from Instagram's data call, with three fields added (`id` and `is_verified` per comment, `post_comment_count` per post), and the other modes end without results unless you provide a session. A run with a missing input field ends with a status message instead of failing.

**Can I build daily alerts?** Yes. Schedule a Task and compare shortcodes in your database. This Actor does not keep cross-run only-new state itself.

**Are all metrics exact or independently verified?** They are values exposed by the source. Missing visibility and hidden counts limit what can be reported.

**How should I use the data?** Follow applicable law, Instagram's terms and your organization's data rules. Public visibility does not grant unrestricted permission for every downstream use.

### Related tools

Need the MP4 files? Use [Instagram Video Downloader](https://apify.com/benthepythondev/instagram-video-downloader).

For one job at larger volume: [Instagram Posts Scraper](https://apify.com/benthepythondev/instagram-posts-scraper) reads whole timelines, [Instagram Reels Scraper](https://apify.com/benthepythondev/instagram-reels-scraper) adds play counts and video links, [Instagram Comments Scraper](https://apify.com/benthepythondev/instagram-comments-scraper) returns one row per comment, and [Instagram Profile Scraper](https://apify.com/benthepythondev/instagram-profile-scraper) takes long lists of accounts.

[Meta Ad Library](https://apify.com/benthepythondev/meta-ad-library-scraper) is a separate advertising-data workflow, not organic Instagram posts. [Facebook Pages](https://apify.com/benthepythondev/facebook-pages-scraper) exports public organizational Page metadata. [LinkedIn Company Scraper](https://apify.com/benthepythondev/linkedin-company-scraper) checks exact company identity before export.

**Keywords:** Instagram scraper, public profile data, Instagram posts, Instagram reels, full captions, date filter, UTC timestamps, shortcodes, engagement counts, public biography, social media research, JSON export, CSV export, timeline pagination.

# Actor input Schema

## `mode` (type: `string`):

What to read. `profile`, `posts`, `reels` and `comments` work without a login. `followers`, `following`, `hashtag`, `search` and `stories` are shown by Instagram to signed-in users only: without your own session cookie these modes end with no results, and no result is charged.

## `username` (type: `string`):

Instagram username to scrape (without @). Profile URLs like https://www.instagram.com/natgeo/ also work. Required for profile, posts, followers, following, reels, and stories modes.

## `postUrls` (type: `array`):

Post or reel links for the comments mode, for example \["https://www.instagram.com/p/DdG4RIxIPyf/"]. One result per post, holding up to 100 of its top-level comments. A link that leads to no public post, or to a post that shows visitors no comment, returns no result and is not charged.

## `hashtag` (type: `string`):

Hashtag to read posts from (without #), for the hashtag mode. Needs `sessionCookie`.

## `searchQuery` (type: `string`):

Words to search profiles and hashtags for, in the search mode. Needs `sessionCookie`.

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

Results to return. Profile, posts and reels accept up to 1,000; public visibility and page limits can return fewer. In comments mode it is the number of posts read.

## `maxCommentsPerPost` (type: `integer`):

Comments to return per post, up to 100 (a larger value is read as 100). For whole comment lists use the Instagram Comments Scraper, which returns one row per comment.

## `includeEngagement` (type: `boolean`):

Optional engagement count or public sample rate. An unavailable public sample does not imply zero engagement.

## `includeSentiment` (type: `boolean`):

Optional keyword-based positive/negative/neutral label; this is a heuristic, not a trained language model.

## `includeLeadScore` (type: `boolean`):

Calculate lead quality score (0-100) based on engagement and authenticity

## `extractEmails` (type: `boolean`):

Extract email addresses from bio and posts

## `extractPhones` (type: `boolean`):

Extract phone numbers from bio and contact button

## `minFollowers` (type: `integer`):

Filter profiles by minimum follower count (0 = no filter)

## `maxFollowers` (type: `integer`):

Filter profiles by maximum follower count (0 = no filter)

## `verifiedOnly` (type: `boolean`):

Only scrape verified accounts

## `sessionCookie` (type: `string`):

Optional. The `sessionid` cookie of your own signed-in browser session, as `sessionid=…` or the bare value. Needed only for followers, following, hashtag, search and stories; profile, posts, reels and comments do not use it. Use only a session and data you are authorized to access. When Instagram does not accept the cookie, the run ends without results.

## `useInstagrapi` (type: `boolean`):

Use Instagram Private API for faster scraping. Requires login credentials.

## `instagrapiUsername` (type: `string`):

Instagram username for Private API authentication

## `instagrapiPassword` (type: `string`):

Instagram password for Private API authentication

## `debugMode` (type: `boolean`):

Run browser in non-headless mode and show detailed logs

## `maxPages` (type: `integer`):

Page cap for public posts/reels. Date filters scan this bounded window; SUMMARY reports truncation.

## `postedAfter` (type: `string`):

Inclusive YYYY-MM-DD UTC date for public posts/reels with useInstagrapi=false. Other modes reject this filter.

## `postedBefore` (type: `string`):

Inclusive YYYY-MM-DD UTC date for public posts/reels with useInstagrapi=false. Other modes reject this filter.

## Actor input object example

```json
{
  "mode": "profile",
  "username": "instagram",
  "maxResults": 2,
  "maxCommentsPerPost": 50,
  "includeEngagement": true,
  "includeSentiment": true,
  "includeLeadScore": true,
  "extractEmails": true,
  "extractPhones": true,
  "minFollowers": 0,
  "maxFollowers": 0,
  "verifiedOnly": false,
  "useInstagrapi": false,
  "debugMode": false,
  "maxPages": 5
}
```

# 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 = {
    "username": "instagram"
};

// Run the Actor and wait for it to finish
const run = await client.actor("benthepythondev/instagram-intelligence-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 = { "username": "instagram" }

# Run the Actor and wait for it to finish
run = client.actor("benthepythondev/instagram-intelligence-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 '{
  "username": "instagram"
}' |
apify call benthepythondev/instagram-intelligence-scraper --silent --output-dataset

```

## MCP server setup

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