# Instagram Profile Posts Scraper (`futurizerush/instagram-profile-posts-scraper`) Actor

Get posts, reels, and carousels from any public Instagram profile. Includes download links, likes, comments, captions, and more. Works with up to 10 profiles at once. No login required.

- **URL**: https://apify.com/futurizerush/instagram-profile-posts-scraper.md
- **Developed by:** [Rush](https://apify.com/futurizerush) (community)
- **Categories:** Videos, Social media, Automation
- **Stats:** 353 total users, 69 monthly users, 80.2% runs succeeded, 5 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.50 / 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Instagram Profile Posts Scraper

Collect public Instagram posts, reels, and carousel media from profile pages or individual post URLs. The dataset includes captions, hashtags, mentions, engagement counts, publish time, media links, and useful post metadata.

Use it for social listening, content research, competitor monitoring, creator discovery, and building Instagram datasets for your analytics workflow.

### What You Can Get

- Public profile posts, reels, and carousel posts
- Image, video, and carousel media links
- Captions, hashtags, and mentioned usernames
- Likes, comments, and video duration
- Publish time, post URL, shortcode, location, tagged users, music name, and coauthors when the post has them
- Reel view counts
- Optional date filtering and pinned-post exclusion

### Input

Add Instagram usernames, profile URLs, post URLs, or reel URLs.

```json
{
    "usernames": [
        "natgeo",
        "https://www.instagram.com/nasa/",
        "https://www.instagram.com/reel/ABC123xyz/"
    ],
    "maxPosts": 25,
    "postsNewerThan": "1 month",
    "excludePinnedPosts": false
}
```

#### Input Settings

| Setting | Required | Default | Description |
|---------|----------|---------|-------------|
| `usernames` | Yes | - | Instagram usernames, profile URLs, post URLs, or reel URLs. Up to 10 entries per run. |
| `maxPosts` | No | 50 | Maximum posts to collect per profile. This does not apply to individual post or reel URLs. |
| `postsNewerThan` | No | - | Collect posts newer than a date such as `2026-01-15`, or a relative period such as `7 days`, `2 weeks`, or `1 month`. |
| `excludePinnedPosts` | No | false | Skip posts pinned to the top of a profile. |

### Output

Each dataset item represents one Instagram post or reel. The example below highlights the most-used fields; the **Full Details** view lists every available field, including author, dimensions, tagged users, location, music, and co-authors.

```json
{
    "username": "natgeo",
    "postUrl": "https://www.instagram.com/reel/ABC123xyz/",
    "mediaDownloadUrl": "https://scontent.cdninstagram.com/.../video.mp4",
    "mediaType": "video",
    "caption": "Example caption with #travel and @natgeo",
    "hashtags": ["travel"],
    "mentions": ["natgeo"],
    "likes": 5230,
    "comments": 187,
    "timestamp": "2026-02-18T14:30:00.000Z",
    "shortcode": "ABC123xyz",
    "videoViewCount": 84500,
    "videoDuration": 143.1,
    "isPinned": false
}
```

For carousel posts with slide data, `mediaDownloadUrl` is an array of media items so you can access each slide.

### Every Field

| Field | What it is |
|-------|------------|
| `username` / `author` | The account the post belongs to |
| `postUrl` | Link to the post or reel |
| `mediaDownloadUrl` | Direct media link; an array of items for a carousel |
| `displayUrl` | Thumbnail / preview image link |
| `videoUrl` | Direct video file link |
| `mediaType` | `image`, `video` or `carousel` |
| `isVideo` / `hasAudio` | Whether the post is a video, and whether it has sound |
| `caption` | The full caption, including hashtags and mentions |
| `hashtags` / `mentions` | Hashtags and mentioned accounts taken from the caption |
| `title` | The opening of the caption, up to 200 characters |
| `description` | Instagram's written description of the image, or the opening of the caption |
| `likes` / `comments` | Engagement counts |
| `commentsDisabled` | Whether comments are turned off |
| `videoViewCount` / `videoDuration` | Views and length, for video posts |
| `timestamp` | When the post was published (ISO 8601) |
| `scrapedAt` | When this row was collected (ISO 8601) |
| `index` | Position of the post within this account's results (1, 2, 3…) |
| `shortcode` | Instagram's identifier for the post |
| `ownerId` | Instagram's numeric id for the account |
| `isPinned` | Whether the post is pinned to the top of the profile |
| `dimensions` | Media width and height in pixels |
| `locationName` | Tagged location, when the post has one |
| `taggedUsers` | Accounts tagged in the media (different from caption mentions) |
| `musicName` | Track and artist for reels |
| `coauthors` | Co-authors of a collaboration post |

### What Instagram Publishes

Instagram does not publish every detail for every post to a signed-out reader, so a few columns are filled in only where it does. They are left empty rather than filled with a stand-in value, so an empty cell always means "Instagram did not publish this", never "zero".

| Column | When it is filled in |
|--------|----------------------|
| `videoViewCount` | Reels. Empty for images, and for any video where Instagram does not publish a count. |
| `isPinned` | Posts collected from a profile. Empty for a post requested by its own link, where Instagram does not say. |
| `commentsDisabled` | Only when Instagram states it. Usually empty for public reads. |
| `likes` / `comments` | Always, unless the account hides its counts — then empty rather than `0`. |
| `locationName`, `musicName`, `taggedUsers`, `coauthors` | Only when the post actually has them. |

### Dataset Views

- **Overview**: username, post type, engagement, publish time, and post URL
- **Media Downloads**: media links and thumbnails
- **Full Details**: all available fields

### Tips

- Start with one or two profiles to confirm the output format before running a larger batch.
- Use `postsNewerThan` when you only need recent content.
- Media links can expire, so download or process media soon after the run finishes.
- An entry that cannot be read — a misspelled name, or a link that is not an account or a post — is reported and skipped, and the rest of the run continues.
- This Actor reads Instagram through Apify Proxy (residential). Your plan needs that access enabled, and the proxy traffic is billed to your Apify account as usual.

### FAQ

**Can it scrape private profiles?**\
No. It only collects data that is publicly available.

**Can I mix profile URLs and post URLs in one run?**\
Yes. You can combine usernames, profile URLs, post URLs, and reel URLs in the same input list.

**Why did I get fewer posts than requested?**\
The profile may have fewer public posts available, your date filter may exclude older posts, or Instagram may not return more public results during that run. When a run stops short of what was available, it says so in the run summary rather than presenting a short collection as a complete one.

**Why is a column empty for some rows?**\
Instagram publishes different details for different posts. See **What Instagram Publishes** above for exactly which columns are filled in when. An empty cell always means Instagram did not publish that value — it never means zero.

**What happens if one entry in my list is wrong?**\
That entry is reported in the run summary and skipped. Every other entry in the same run is still collected.

**Does it scrape comments or followers?**\
No. This Actor focuses on profile posts, reels, and carousel media.

### Responsible Use

Use this Actor only for lawful purposes and respect Instagram's terms, privacy rights, and applicable data protection laws. Results depend on publicly available data at the time of the run.

### Disclaimer

This tool collects publicly available data for research and analysis. You are responsible for ensuring your use complies with Instagram's Terms of Service and all applicable laws.

- Instagram controls what it publishes publicly and can change it at any time, so the number of posts available for a profile varies and can differ between runs
- The developers are not responsible for consequences arising from use of this tool, including data loss or legal liability
- Extracted data should be handled in line with applicable data protection regulations

### More Actors

Looking for other Instagram data? Explore [more scrapers by futurizerush](https://apify.com/futurizerush?fpr=rush) — comments, followers, hashtags, and user posts.

### Related Search Keywords

Instagram scraper, Instagram posts scraper, Instagram reels scraper, Instagram carousel scraper, Instagram media downloader, Instagram analytics, social media monitoring, influencer research, competitor analysis, lead generation, Apify, Claude Code, OpenClaw, Gemini, Antigravity, Codex, ChatGPT

# Actor input Schema

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

Instagram usernames, profile URLs, or post/reel URLs. Example: natgeo, https://www.instagram.com/natgeo/, https://www.instagram.com/p/ABC123/

## `maxPosts` (type: `integer`):

How many posts to collect from each profile. Does not apply to individual post or reel URLs.

## `postsNewerThan` (type: `string`):

Only get posts published after this date. Accepts a specific date (e.g. 2026-01-15) or a relative period (e.g. 7 days, 2 weeks, 1 month). Leave empty to get all posts. Applies to profile targets only, not individual post or reel URLs. Automatically stops loading older pages to save time.

## `excludePinnedPosts` (type: `boolean`):

Skip pinned posts at the top of profiles and only get regular timeline posts.

## Actor input object example

```json
{
  "usernames": [
    "natgeo",
    "nasa"
  ],
  "maxPosts": 50,
  "excludePinnedPosts": false
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `media` (type: `string`):

No description

## `full` (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 = {
    "usernames": [
        "natgeo",
        "nasa"
    ],
    "maxPosts": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("futurizerush/instagram-profile-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 = {
    "usernames": [
        "natgeo",
        "nasa",
    ],
    "maxPosts": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("futurizerush/instagram-profile-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 '{
  "usernames": [
    "natgeo",
    "nasa"
  ],
  "maxPosts": 50
}' |
apify call futurizerush/instagram-profile-posts-scraper --silent --output-dataset

```

## MCP server setup

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