# Instagram Posts Scraper - Reels, Video URLs, Engagement (`parseforge/instagram-posts-scraper`) Actor

Reads the latest posts and reels of public Instagram profiles or post URLs, no login. Caption, exact likes and comments, views and plays, video URLs, carousel slides, location when tagged, owner followers and bio, up to 54 fields on paid plans. About 12 posts plus 12 reels per profile.

- **URL**: https://apify.com/parseforge/instagram-posts-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Social media, Automation, Developer tools
- **Features:** Limited permissions
- **Stats:** 498 total users, 13 monthly users, 97.0% runs succeeded, 7 bookmarks
- **User rating**: 4.76 out of 5 stars

## Pricing

from $0.89 / 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

![ParseForge Banner](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner-v4.webp)

## 📸 Instagram Posts Scraper

> 🚀 **Extract Instagram posts, Reels, and profile data in minutes.** Pull from any public account by username, profile URL, or post URL. Filter by media type and date range. No login, no API keys, no Instagram developer approval.

**No minimum charge:** you only pay for the results you get.

> 🕒 **Last updated:** 2026-10-21 · **📊 up to 54 fields** per post · **🎬 Reels/images/video/carousel** · **📅 Date filtering** · **🚫 No auth** required

##### 🎁 Paid plan adds

<table><tr>
<td align="center" width="25%">📈<br><b>Virality metrics</b><br><sub>Likes/hour and velocity</sub></td><td align="center" width="25%">📝<br><b>Caption intelligence</b><br><sub>CTAs, emojis, hashtag stats; emails, phones, URLs when the caption has them</sub></td><td align="center" width="25%">💸<br><b>Sponsorship detection</b><br><sub>Branded and paid posts</sub></td><td align="center" width="25%">🏷️<br><b>Collaborator details</b><br><sub>Top collaborators and location lookups</sub></td>
</tr></table>

The **Instagram Posts Scraper** collects post data from any public Instagram profile, returning **up to 54 fields per post** (35 base fields, plus about 19 analytics fields on paid plans): caption, hashtags, mentions, exact like and comment counts, view and play counts, media type, video URL, image URLs, carousel children, location (when the post is tagged), tagged users, collaborators, alt text, video duration, exact timestamp, and the owner's follower count, bio and verified badge. No login is needed: the scraper reads a profile page by page, newest first, until it has the number of posts you ask for or the profile ends (see **How many posts can I get per profile?** below). The paid plan removes the 10-item free cap.

The Actor accepts three input formats in the same run: usernames (nike), profile URLs (`https://instagram.com/nike`), and individual post URLs (`https://instagram.com/p/ABC123`). Filter by media type (image, video, Reel, carousel) and date range (absolute dates, ISO timestamps, or relative like "30 days"). No Instagram account, Graph API credentials, or developer approval needed.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Social media analysts, influencer marketing teams, brand managers, growth hackers, academic researchers, content strategists | Competitor analysis, engagement benchmarking, influencer vetting, hashtag research, content audits, trend tracking |

***

### 📋 What the Instagram Posts Scraper does

Three input formats with media and date filters:

- 👤 **Username mode.** Enter usernames like nike or cristiano to pull their recent posts.
- 🔗 **URL mode.** Paste profile URLs (`instagram.com/nike`) or individual post URLs (`instagram.com/p/ABC123`).
- 🎬 **Media type filter.** Restrict to image, video, reel, or carousel posts only.
- 📅 **Date filter.** Limit results by absolute dates (`2025-01-01`), ISO timestamps, or relative periods (`30 days`, `3 months`, `1 year`).

Each post record includes caption, parsed hashtag and mention arrays, engagement metrics (likes, comments, views, plays), media type and product type, video URL, all image URLs, carousel children, location when tagged, tagged users, collaborators, alt text, video duration, post URL, shortcode, exact timestamps, and owner facts (followers, following, bio, verified badge, link in bio).

> ℹ️ **Good to know:** media links (`videoUrl`, `imageUrls`, `thumbnailUrl`) are Instagram CDN links and expire after a few days, so download the files soon if you need them. Without a login, Instagram does not expose comments, and play counts for collaboration posts that are not Reels can be missing. Paid-only analytics fields (virality, caption stats, sponsorship detection) are added on paid plans; `emailsInCaption`, `phonesInCaption` and `urlsInCaption` only appear when the caption actually contains one.

> 💡 **Why it matters:** the official Instagram Graph API only returns data for accounts you own or manage. This Actor reads the same public data any visitor sees and returns it as structured JSON, CSV, or Excel, making competitor analysis, influencer vetting, and hashtag research practical at scale.

***

### 🎬 Full Demo

*🚧 Coming soon: a 3-minute walkthrough showing how to go from sign-up to a downloaded dataset.*

***

### ⚙️ Input

<table>
<thead>
<tr><th>Input</th><th>Type</th><th>Default</th><th>Behavior</th></tr>
</thead>
<tbody>
<tr><td>startUrls</td><td>array</td><td>[]</td><td>Usernames, profile URLs, post/reel URLs, #hashtags, explore/tags and explore/locations URLs. All formats accepted in the same run.</td></tr>
<tr><td>maxItems</td><td>integer</td><td>10</td><td>Max posts per profile. Free: up to 10. Paid: any number, read page by page (newest first) until reached or the profile ends. Empty: the whole profile (paid).</td></tr>
<tr><td>maxItemsTotal</td><td>integer</td><td>-</td><td>Optional total cap across all profiles combined.</td></tr>
<tr><td>mediaTypeFilter</td><td>string</td><td>"all"</td><td>Filter: all, image, video, reel, or carousel.</td></tr>
<tr><td>dateFilter</td><td>string</td><td>""</td><td>Date range: 2025-01-01, 30 days, 3 months, 1 year.</td></tr>
<tr><td>sessionid</td><td>string (secret)</td><td>-</td><td>Optional. The sessionid cookie of your own (preferably throwaway) Instagram account. Only needed for the Tagged Profiles input; normal profile runs do not use it. See the FAQ below before using it.</td></tr>
<tr><td>hashtags</td><td>array</td><td>[]</td><td>Hashtags to read (cats or #cats). Logged out, Instagram shows the 12 most popular reels of a tag, with views and video URL. Rows carry sourceType "hashtag".</td></tr>
<tr><td>locations</td><td>array</td><td>[]</td><td>Location ids or explore/locations URLs. Logged out, Instagram shows the 12 top posts of the place, with likes, comments and location.</td></tr>
<tr><td>taggedProfiles</td><td>array</td><td>[]</td><td>Posts where a profile is tagged. Instagram shows this tab only to logged-in accounts, so it needs the optional sessionid.</td></tr>
<tr><td>includeComments</td><td>boolean</td><td>false</td><td>Adds the top comments Instagram shows on the post page (about 12 to 15) to each row: id, text, username, likeCount, createdAt, replyCount.</td></tr>
<tr><td>maxCommentsPerPost</td><td>integer</td><td>10</td><td>Comments kept per post, 1 to 50.</td></tr>
<tr><td>endDate</td><td>string</td><td>-</td><td>Newest post to keep (YYYY-MM-DD inclusive, ISO, or relative). Use with dateFilter for a window.</td></tr>
<tr><td>skipPinned</td><td>boolean</td><td>false</td><td>Drops pinned posts. Logged out, Instagram does not flag them, so pinned posts are detected by their older date sitting in the first grid slots.</td></tr>
<tr><td>proxyConfiguration</td><td>object</td><td>Apify residential (US)</td><td>If you leave it out, the actor uses Apify residential proxies (US). Pass {"useApifyProxy": false} to run with no proxy (Instagram then blocks most requests).</td></tr>
</tbody>
</table>

**Example: last 30 days of Reels from two profiles.**

```json
{
    "startUrls": ["cristiano", "https://www.instagram.com/nike/"],
    "maxItems": 50,
    "mediaTypeFilter": "reel",
    "dateFilter": "30 days"
}
```

**Example: popular reels of a hashtag and top posts of a location.**

```json
{
    "hashtags": ["cats"],
    "locations": ["213385402"]
}
```

**Example: latest posts with comments, no pinned posts.**

```json
{
    "startUrls": ["natgeo"],
    "maxItems": 12,
    "includeComments": true,
    "skipPinned": true
}
```

**Example: the latest posts from a single profile URL.**

```json
{
    "startUrls": ["https://www.instagram.com/natgeo/"],
    "maxItems": 100
}
```

> ⚠️ **Good to Know:** the actor runs on Apify residential proxies (US) by default, including API runs that only send usernames, because Instagram rate-limits datacenter and bare IPs aggressively (in our tests about a third of the rows came back without a proxy). You can set your own proxy, or opt out with `{"useApifyProxy": false}`.

***

### 📊 Output

Each post record contains **up to 54 fields** (35 base fields, 22 to 29 on a typical free row, about 45 to 51 on a paid row; fields that do not apply to a post are left out, for example `location` on untagged posts). Download the dataset as CSV, Excel, JSON, or XML.

#### 🧾 Schema

| Field | Type | Example |
|---|---|---|
| 🖼️ thumbnailUrl | string | `"https://scontent-..."` |
| 📝 caption | string | `"Golden hour over the canyon."` |
| 👤 username | string | `"natgeo"` |
| 👍 likeCount | number | `42891` |
| 💬 commentCount | number | `1204` |
| 📈 viewCount | number | `980000` |
| ▶️ playCount | number | `850000` |
| 🎬 mediaType | string | `"video"` |
| 🎬 productType | string | `"feed"` |
| 🎥 videoUrl | string | `"https://scontent-..."` |
| 🖼️ imageUrls | array | `["https://scontent-..."]` |
| 🖼️ carouselMediaCount | number | `3` |
| 🖼️ childPosts | array | `[{"type": "Image", "displayUrl": "https://scontent-..."}]` |
| #️⃣ hashtags | array | `["goldenhour", "canyon"]` |
| @ mentions | array | `[]` |
| 📍 location | object | `{"name": "Grand Canyon National Park", "id": "123", "lat": 36.1, "lng": -112.1}` |
| 👥 taggedUsers | array | `[]` |
| 🤝 collaborators | array | `[]` |
| 👑 ownerFollowerCount | number | `104000000` |
| ✅ ownerIsVerified | boolean | `true` |
| 🧾 ownerBiography | string | `"Explore the universe"` |
| 🔗 ownerExternalUrl | string | `"https://linkin.bio/..."` |
| 🌿 altText | string | null | null |
| ⏱️ videoDuration | number | null | `45.2` |
| 🔗 postUrl | string | `"https://www.instagram.com/p/DPwJzEVDbwC/"` |
| 🆔 shortcode | string | `"DPwJzEVDbwC"` |
| 📅 timestamp | ISO 8601 | `"2025-10-13T14:40:07.000Z"` |
| 🕒 scrapedAt | ISO 8601 | `"2026-04-16T00:00:00.000Z"` |

#### 📦 Sample records

<details>
<summary><strong>🎥 Video post with high engagement</strong></summary>

```json
{
    "thumbnailUrl": "https://scontent-example.cdninstagram.com/v/thumb.jpg",
    "caption": "Golden hour over the canyon. Nature never disappoints.",
    "username": "natgeo",
    "likeCount": 42891,
    "commentCount": 1204,
    "viewCount": 980000,
    "playCount": 850000,
    "mediaType": "video",
    "productType": "feed",
    "videoUrl": "https://scontent-example.cdninstagram.com/v/video.mp4",
    "imageUrls": [],
    "carouselCount": 0,
    "hashtags": ["goldenhour", "canyon", "natgeo"],
    "mentions": [],
    "location": "Grand Canyon National Park",
    "taggedUsers": [],
    "collaborators": [],
    "commentsDisabled": false,
    "likesHidden": false,
    "altText": null,
    "videoDuration": 45.2,
    "postUrl": "https://www.instagram.com/p/DPwJzEVDbwC/",
    "shortcode": "DPwJzEVDbwC",
    "timestamp": "2025-10-13T14:40:07.000Z",
    "scrapedAt": "2026-04-16T00:00:00.000Z"
}
```

</details>

<details>
<summary><strong>🖼️ Image post with hashtags and location</strong></summary>

```json
{
    "thumbnailUrl": "https://scontent-example.cdninstagram.com/v/image.jpg",
    "caption": "Morning run through the city. #fitness #running #nyc",
    "username": "fitness_daily",
    "likeCount": 312,
    "commentCount": 18,
    "viewCount": null,
    "playCount": null,
    "mediaType": "image",
    "productType": "feed",
    "videoUrl": null,
    "imageUrls": ["https://scontent-example.cdninstagram.com/v/image.jpg"],
    "carouselCount": 0,
    "hashtags": ["fitness", "running", "nyc"],
    "mentions": [],
    "location": "Central Park",
    "taggedUsers": [],
    "collaborators": [],
    "commentsDisabled": false,
    "likesHidden": false,
    "altText": "Person running through a park at sunrise",
    "videoDuration": null,
    "postUrl": "https://www.instagram.com/p/ABC123/",
    "shortcode": "ABC123",
    "timestamp": "2026-03-15T07:22:00.000Z",
    "scrapedAt": "2026-04-16T00:00:00.000Z"
}
```

</details>

<details>
<summary><strong>🎬 Reel with sparse engagement</strong></summary>

```json
{
    "thumbnailUrl": "https://scontent-example.cdninstagram.com/v/reel-thumb.jpg",
    "caption": "Quick recipe for the week",
    "username": "home_cook_99",
    "likeCount": 8,
    "commentCount": 0,
    "viewCount": 142,
    "playCount": 130,
    "mediaType": "video",
    "productType": "clips",
    "videoUrl": "https://scontent-example.cdninstagram.com/v/reel.mp4",
    "imageUrls": [],
    "carouselCount": 0,
    "hashtags": [],
    "mentions": [],
    "location": null,
    "taggedUsers": [],
    "collaborators": [],
    "commentsDisabled": false,
    "likesHidden": true,
    "altText": null,
    "videoDuration": 22.8,
    "postUrl": "https://www.instagram.com/reel/XYZ789/",
    "shortcode": "XYZ789",
    "timestamp": "2026-04-10T18:05:00.000Z",
    "scrapedAt": "2026-04-16T00:00:00.000Z"
}
```

</details>

***

### ✨ Why choose this Actor

| | Capability |
|---|---|
| 📸 | **Up to 54 fields per post.** Caption, hashtags, mentions, engagement, media URLs, location, tagged users, and timestamps. |
| 🎬 | **Media type filter.** Restrict to images, videos, Reels, or carousels in a single parameter. |
| 📅 | **Date filtering.** Absolute dates, ISO timestamps, or relative periods like "30 days" or "3 months". |
| 🔗 | **Three input formats.** Usernames, profile URLs, and individual post URLs in the same run. |
| ⚡ | **Fast.** A profile with its latest posts is usually done in under a minute. |
| 📊 | **Per-profile and total caps.** Control exactly how many posts to collect from each account. |
| 🚫 | **No authentication.** No Instagram login, Graph API credentials, or developer approval needed. |

> 📊 Instagram has over 2 billion monthly active users. Having structured access to public post data is the foundation for any social media analysis, influencer marketing, or competitive intelligence workflow.

***

### 📈 How it compares to alternatives

| Approach | Cost | Coverage | Refresh | Filters | Setup |
|---|---|---|---|---|---|
| **⭐ Instagram Posts Scraper** *(this Actor)* | $5 free credit, then pay-per-use | Any public profile | **Live per run** | media type, date range, per-profile cap | ⚡ 2 min |
| Instagram Graph API | Free with restrictions | Only your own accounts | Real-time | Many | 🐢 Days (app review) |
| Third-party social analytics tools | $99-499/month | Multi-platform | Varies | Many | ⏳ Hours |
| Manual browsing | Free | Manual | Manual | Instagram UI only | 🕒 Hours per account |

Pick this Actor when you want public Instagram data on demand, without Graph API credentials, without managing tokens, and without paying for a full social analytics subscription.

***

### 🚀 How to use

1. 📝 **Sign up.** [Create a free account with $5 credit](https://console.apify.com/sign-up?fpr=vmoqkp) (takes 2 minutes).
2. 🌐 **Open the Actor.** Go to the Instagram Posts Scraper page on the Apify Store.
3. 🎯 **Set input.** Add usernames, profile URLs, or post URLs. Set media type filter, date range, and maxItems.
4. 🚀 **Run it.** Click **Start** and let the Actor collect your data.
5. 📥 **Download.** Grab your results in the **Dataset** tab as CSV, Excel, JSON, or XML.

> ⏱️ Total time from signup to downloaded dataset: **3-5 minutes.** No coding required.

***

### 💼 Business use cases

<table>
<tr>
<td width="50%" valign="top">

#### 📊 Social Media Analytics

- Track engagement across competitor accounts
- Benchmark posting cadence and content mix
- Build weekly reports on share of voice by hashtag
- Monitor brand mention volume over time

</td>
<td width="50%" valign="top">

#### 🤝 Influencer Marketing

- Vet creators by engagement rate and posting frequency
- Filter for Reels-only to evaluate short-form content
- Compare collaborator and tagged-user networks
- Build shortlists filtered by date range and media type

</td>
</tr>
<tr>
<td width="50%" valign="top">

#### 🎨 Content Strategy

- Research which content formats drive engagement
- Analyze competitor caption and hashtag strategies
- Track trending visual styles via alt-text data
- Build content calendars from competitor posting patterns

</td>
<td width="50%" valign="top">

#### 🎓 Academic & Market Research

- Build public-discourse datasets from Instagram
- Analyze brand representation across categories
- Study visual content trends with image URLs
- Export structured data for quantitative analysis

</td>
</tr>
</table>

***

***

### 🌟 Beyond business use cases

Data like this powers more than commercial workflows. The same structured records support research, education, civic projects, and personal initiatives.

<table>
<tr>
<td width="50%">

#### 🎓 Research and academia

- Empirical datasets for papers, thesis work, and coursework
- Longitudinal studies tracking changes across snapshots
- Reproducible research with cited, versioned data pulls
- Classroom exercises on data analysis and ethical scraping

</td>
<td width="50%">

#### 🎨 Personal and creative

- Side projects, portfolio demos, and indie app launches
- Data visualizations, dashboards, and infographics
- Content research for bloggers, YouTubers, and podcasters
- Hobbyist collections and personal trackers

</td>
</tr>
<tr>
<td width="50%">

#### 🤝 Non-profit and civic

- Transparency reporting and accountability projects
- Advocacy campaigns backed by public-interest data
- Community-run databases for local issues
- Investigative journalism on public records

</td>
<td width="50%">

#### 🧪 Experimentation

- Prototype AI and machine-learning pipelines with real data
- Validate product-market hypotheses before engineering spend
- Train small domain-specific models on niche corpora
- Test dashboard concepts with live input

</td>
</tr>
</table>

### 🤖 Ask an AI assistant about this scraper

Open a ready-to-send prompt about this ParseForge actor in the AI of your choice:

- 💬 [**ChatGPT**](https://chat.openai.com/?q=How%20do%20I%20use%20the%20Instagram%20Posts%20Scraper%20by%20ParseForge%20on%20Apify%3F%20Show%20me%20input%20examples%2C%20output%20fields%2C%20common%20use%20cases%2C%20and%20how%20to%20integrate%20it%20into%20a%20workflow.)
- 🧠 [**Claude**](https://claude.ai/new?q=How%20do%20I%20use%20the%20Instagram%20Posts%20Scraper%20by%20ParseForge%20on%20Apify%3F%20Show%20me%20input%20examples%2C%20output%20fields%2C%20common%20use%20cases%2C%20and%20how%20to%20integrate%20it%20into%20a%20workflow.)
- 🔍 [**Perplexity**](https://perplexity.ai/search?q=How%20do%20I%20use%20the%20Instagram%20Posts%20Scraper%20by%20ParseForge%20on%20Apify%3F%20Show%20me%20input%20examples%2C%20output%20fields%2C%20common%20use%20cases%2C%20and%20how%20to%20integrate%20it%20into%20a%20workflow.)
- 🅒 [**Copilot**](https://copilot.microsoft.com/?q=How%20do%20I%20use%20the%20Instagram%20Posts%20Scraper%20by%20ParseForge%20on%20Apify%3F%20Show%20me%20input%20examples%2C%20output%20fields%2C%20common%20use%20cases%2C%20and%20how%20to%20integrate%20it%20into%20a%20workflow.)

### ❓ Frequently Asked Questions

<details>
<summary><b>💳 Do I need a paid Apify plan to run this actor?</b></summary>

No. You can start right now on the free Apify plan, which includes **$5 in free monthly credit**. That is enough to run this actor several times and explore the output before committing to anything. Paid plans unlock higher limits, more concurrent runs, and larger datasets. [Create a free Apify account here](https://console.apify.com/sign-up?fpr=vmoqkp) to get started.

</details>

<details>
<summary><b>🚨 What happens if my run fails or returns no results?</b></summary>

Failed runs are not charged. If the source site changes, proxies get rate-limited, or a specific input matches nothing, re-run the actor or open our [contact form](https://tally.so/r/BzdKgA) and we will investigate. You can also check the run log in the Apify console to see why the run stopped.

</details>

<details>
<summary><b>📏 How many items can I scrape per run?</b></summary>

Free users are limited to **10 items per profile** so you can preview the output and confirm the actor works for your use case. Paid users can ask for more: the scraper pages through the profile (see the next question). You can add as many profiles as you like in one run.

</details>

<details>
<summary><b>📸 How many posts can I get per profile?</b></summary>

No login needed. The scraper asks Instagram's public web endpoints for a profile's posts page by page (12 to 50 per request), newest first, and stops at `maxItems`, at the end of the profile, or when posts get older than your date filter. Tested on profiles with hundreds of posts. Likes, comments, exact timestamp, video URL, carousel children, tagged users, collaborators, location and music come from each post's own detail request; play counts of videos come from the post's embed page. Limits you should know: play counts can be empty for collaboration posts, comments (`includeComments`) are the 12 to 15 Instagram shows on the post page, hashtag and location inputs still return about the 12 posts those pages show, and the endpoints are Instagram's and can change; when the main route fails the actor falls back to the profile page (about 12 posts plus up to 12 reels) and says so in the log. Likes and comments of large accounts are rounded by Instagram (for example 653K).

</details>

<details>
<summary><b>🔐 Can I use my own Instagram login (sessionid)?</b></summary>

Optionally, yes, but normal profile runs do not need it. Paste the value of the `sessionid` cookie of an Instagram account into the **sessionid** input and the Actor reads through that account (needed for the Tagged Profiles input). Leave it empty and nothing changes: the normal logged-out run, with no account involved.

- **Use a throwaway or secondary account, never your main one.** Instagram may restrict, challenge or ban an account that is used for automation. That risk belongs to the account owner. We cannot recover a restricted account.
- **How to find it:** log in at instagram.com in your browser, open Developer Tools (F12), go to Application (Chrome, Edge) or Storage (Firefox), open Cookies, click `https://www.instagram.com`, and copy the Value of the cookie named `sessionid`. Paste only that value.
- **Nothing is stored.** The field is a secret input. The value is used only for requests to instagram.com during the run, through a single residential proxy IP kept for the whole run, and it is never written to the log, the dataset, the key-value store or telemetry.
- **Slow and gentle on purpose:** one profile and one request at a time, with random pauses and a longer rest every few pages. A large profile takes minutes, not seconds.
- **It stops at once** if Instagram rejects the session, asks the account for a security check, or answers 429. The run then ends as failed with a clear message ("Session rejected by Instagram. Log in again and paste a fresh sessionid"), and the rows already read are kept in the dataset. Open Instagram with that account, finish any check, log in again and paste a new sessionid.
- Residential proxies are required in this mode. Prices and output fields are the same as in the normal mode; you pay per result as usual. Free plan limits still apply. How much history comes back depends on the account and on Instagram, and is not guaranteed.

</details>

<details>
<summary><b>🕒 How fresh is the data?</b></summary>

Every run fetches live data at the moment of execution. There is no cache or delay: the records you get reflect what the source returned at that moment. Schedule the actor to maintain a rolling snapshot of the data you need.

</details>

<details>
<summary><b>🧑‍💻 Can I call this actor from my own code?</b></summary>

Yes. Apify exposes every actor as a REST endpoint and ships first-class SDKs for [Node.js](https://docs.apify.com/sdk/js) and [Python](https://docs.apify.com/sdk/python). You can start a run, read the dataset, and handle webhooks from your own app in a few lines. All you need is your Apify API token.

</details>

<details>
<summary><b>📤 How do I export the data?</b></summary>

Every Apify dataset can be downloaded in one click from the console as CSV, JSON, JSONL, Excel, HTML, XML, or RSS. You can also pull results programmatically via the [Apify API](https://docs.apify.com/api/v2) or stream them into BigQuery, S3, and other destinations through built-in integrations.

</details>

<details>
<summary><b>📅 Can I schedule the actor to run automatically?</b></summary>

Yes. Use the Apify scheduler to run the actor on any cadence, from hourly to monthly. Results are saved to your dataset and can be delivered to webhooks, email, Slack, cloud storage, or automation tools such as Zapier and Make.

***

</details>

### 🔌 Automating Instagram Posts Scraper

Control the scraper programmatically for scheduled runs and pipeline integrations:

- 🟢 **Node.js.** Install the apify-client NPM package.
- 🐍 **Python.** Use the apify-client PyPI package.
- 📚 See the [Apify API documentation](https://docs.apify.com/api/v2) for full details.

The [Apify Schedules feature](https://docs.apify.com/platform/schedules) lets you trigger this Actor on any cron interval. Weekly pulls keep your social-listening dashboards in sync automatically.

### 🔌 Integrate with any app

Instagram Posts Scraper connects to any cloud service via [Apify integrations](https://apify.com/integrations):

- [**Make**](https://docs.apify.com/platform/integrations/make) - Automate multi-step workflows
- [**Zapier**](https://docs.apify.com/platform/integrations/zapier) - Connect with 5,000+ apps
- [**Slack**](https://docs.apify.com/platform/integrations/slack) - Get run notifications in your channels
- [**Airbyte**](https://docs.apify.com/platform/integrations/airbyte) - Pipe Instagram data into your warehouse
- [**GitHub**](https://docs.apify.com/platform/integrations/github) - Trigger runs from commits and releases
- [**Google Drive**](https://docs.apify.com/platform/integrations/drive) - Export datasets straight to Sheets

You can also use webhooks to trigger downstream actions when a run finishes. Push fresh Instagram data into your social-listening dashboard, or alert your team in Slack.

***

### 🔗 Recommended Actors

- [**👤 Instagram Profile Scraper**](https://apify.com/parseforge/instagram-profile-scraper) - Bio, follower counts, verification, and profile metadata
- [**🎬 Instagram Reel Scraper**](https://apify.com/parseforge/instagram-reel-scraper) - Reels data with views, likes, comments, and audio tracks
- [**#️⃣ Instagram Hashtag Analytics Scraper**](https://apify.com/parseforge/instagram-hashtag-analytics-scraper) - Top and recent posts by hashtag with volume stats
- [**🐦 X.com Tweets Scraper**](https://apify.com/parseforge/x-com-scraper) - Tweet data, engagement metrics, and author details
- [**📱 Reddit Posts Scraper**](https://apify.com/parseforge/reddit-posts-scraper) - Reddit posts with score, comments, and flair filters

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge) for more social media scrapers.

***

**🆘 Need Help?** [**Open our contact form**](https://tally.so/r/BzdKgA) to request a new scraper, propose a custom data project, or report an issue.

***

> **⚠️ Disclaimer:** this Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Instagram, Meta Platforms, Inc., or any of their subsidiaries. All trademarks mentioned are the property of their respective owners. Only publicly available post data is collected.

# Actor input Schema

## `startUrls` (type: `array`):

Usernames, profile URLs, post/reel URLs, hashtags (#cats or explore/tags URL), location URLs (explore/locations/ID) and, with a sessionid, tagged URLs (instagram.com/USER/tagged/).

- Usernames: nike, @cristiano
- Profile URLs: https://instagram.com/nike
- Post URLs: https://instagram.com/p/ABC123, https://instagram.com/reel/XYZ789
- Hashtag: #cats or https://www.instagram.com/explore/tags/cats/
- Location: https://www.instagram.com/explore/locations/213385402/

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

Hashtags to read, with or without #. Without a login Instagram shows the 12 most popular reels of a tag (with views and video URL); it hides the rest.

## `locations` (type: `array`):

Instagram location ids or explore/locations URLs. Without a login Instagram shows the 12 top posts of a place.

## `taggedProfiles` (type: `array`):

Usernames whose 'tagged' tab to read (posts where they are tagged). Instagram only shows this to logged-in accounts, so it needs the optional sessionid below.

## `maxItems` (type: `integer`):

Maximum posts to extract per profile/user. Free users: limited to 10 per profile. Paid users: any number; the scraper pages through the profile (12 to 50 posts per request) until it has that many, or the profile has no more posts. Leave empty to read the whole profile (paid users only). Cost and run time grow with the number of posts.

## `maxItemsTotal` (type: `integer`):

Maximum total posts to extract across all profiles (optional). Free users: limited to 10 total. Paid users: optional. If set, the scraper stops once this limit is reached. If both maxItems and maxItemsTotal are set, both limits are respected.

## `dateFilter` (type: `string`):

Limit how far back to the history the scraper should go. The date should be in YYYY-MM-DD or full ISO absolute format (e.g., 2024-01-15 or 2024-01-15T00:00:00Z) or in relative format (e.g., 1 days, 2 months, 3 years). All time values are taken in UTC timezone.

## `endDate` (type: `string`):

Newest post to keep: YYYY-MM-DD (that whole day included), full ISO date-time, or relative (1 days, 2 weeks). Pair it with Date Filter (oldest post) to get a window.

## `mediaTypeFilter` (type: `string`):

Filter posts by content type. Use 'reel' to get only Reels, 'image' for photos only, 'carousel' for multi-image posts, or 'video' for all video content.

## `skipPinned` (type: `boolean`):

Leave out posts pinned to the top of a profile, so the rows are the real latest posts.

## `includeComments` (type: `boolean`):

Add the top comments Instagram shows on each post page (about 12 to 15, with author, text, likes and reply count) to every row. Costs one extra page request per post, so runs are slower.

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

Comments to keep per post when comments are on (1 to 50, default 10). Instagram shows about 12 to 15 without a login.

## `sessionid` (type: `string`):

OPTIONAL. Leave empty for the normal logged-out run, which already reads a profile page by page. Only needed for the posts where a profile is tagged (Tagged Profiles). Paste the value of the 'sessionid' cookie of an Instagram account. Use a throwaway or secondary account, never your main one: Instagram may restrict or ban an account used for automation, and that risk is yours. To find it: log in to instagram.com in a browser, open Developer Tools (F12), Application (Chrome) or Storage (Firefox), Cookies, https://www.instagram.com, and copy the Value of 'sessionid'. The value is a secret input: it is only sent to instagram.com through one residential proxy IP for this run, and is never stored, logged or written to the dataset. The run stops at once if Instagram rejects the session or asks for a security check. Free plan limits still apply.

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

Proxy settings. If left out of the input, the actor uses Apify residential proxies (US), because Instagram throttles other IPs. Choose 'No proxy' (useApifyProxy false) only to opt out.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.instagram.com/instagram/"
  ],
  "maxItems": 10,
  "mediaTypeFilter": "all",
  "skipPinned": false,
  "includeComments": false,
  "maxCommentsPerPost": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "startUrls": [
        "https://www.instagram.com/instagram/"
    ],
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/instagram-posts-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 = {
    "startUrls": ["https://www.instagram.com/instagram/"],
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/instagram-posts-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 '{
  "startUrls": [
    "https://www.instagram.com/instagram/"
  ],
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call parseforge/instagram-posts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parseforge/instagram-posts-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/n1casnnZcoXbQeHnG/builds/6oDsRL2DSoDdfXY6f/openapi.json
