# Instagram Posts & Reels Scraper (`toolzerhub/instagram-profile-content-scraper`) Actor

Scrape posts, reels, tagged posts, active stories, and the highlight tray from one or more public Instagram accounts. Get post code, like count, comment count, post date, and media type for every post or reel, plus story and highlight-tray status. No Instagram login required to pull public content.

- **URL**: https://apify.com/toolzerhub/instagram-profile-content-scraper.md
- **Developed by:** [ToolzerHub](https://apify.com/toolzerhub) (community)
- **Categories:** Social media, For creators, Automation
- **Stats:** 2 total users, 1 monthly users, 87.5% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.85 / 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/platform/actors/running/actors-in-store#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 Content Scraper — Posts, Reels & Highlights

Pull everything a public Instagram account has published — posts, reels, tagged posts, live stories, or the highlight tray. No login, no cookie, no session.

One field picks the content type. Five types, one Actor.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `profiles` | array | — | **Required.** Accounts to pull from. |
| `scraperType` | enum | `userPosts` | **Required.** See the table below. |
| `limit` | integer | `100` | Rows per account. `0` pulls everything available. |
| `addonHighlightDetails` | boolean | `false` | Highlights only — swaps each tray row for its full media. |

| `scraperType` | Returns |
|---|---|
| `userPosts` | Feed posts |
| `userReels` | Reels |
| `userTaggedPosts` | Posts other people tagged this account in |
| `userStories` | Stories live right now |
| `userHighlights` | The highlight tray — id, title, cover |

```json
{
  "profiles": ["cristiano"],
  "scraperType": "userPosts",
  "limit": 100
}
```

`limit` is per account. Three accounts at 100 returns up to 300 rows.

### Output

| Field | What it holds |
|---|---|
| `pk` | Instagram media ID |
| `code` | Shortcode — the identifier in a post URL |
| `like_count` | Likes |
| `comment_count` | Comments |
| `taken_at` | When it was posted |
| `media_type` | Image, video, or carousel |
| `has_story` | Whether a story is live, in Stories mode |
| `title` | Highlight title, in Highlights mode |
| `media_count` | Items in the highlight, in Highlights mode |
| `enriched` | Whether full highlight media was fetched |
| `source_username` | Which account this row came from |

```json
{
  "pk": "3412987456123456789",
  "code": "DDPp2UWzWEm",
  "like_count": 1842203,
  "comment_count": 12043,
  "taken_at": 1785312000,
  "source_username": "cristiano"
}
```

Keep `code` — it's what [Instagram Media Engagement](https://apify.com/toolzerhub/instagram-media-engagement-scraper) takes to get comments and likers.

### Tagged posts are the underused one

`userTaggedPosts` returns posts *other people* published tagging this account. For a brand that's user-generated content and unpaid mentions, found without a hashtag and without guessing the wording. It's the mode most people don't know is there.

### Highlights: the tray, then the media

`userHighlights` returns the tray by default — one row per highlight with its id, title, and cover image. That's cheap and usually enough to see what an account keeps pinned.

`addonHighlightDetails` swaps each row for the full highlight media, and **bills per highlight**. An account with 40 highlights costs 40 extra events. The tray is trimmed to `limit` before enrichment runs, so you're never charged for rows that wouldn't have been saved.

### Questions

**Do stories actually work without a login?**
Only public ones, and only while they're live. `userStories` returns what's up at the moment the run happens — a run twenty-four hours later returns something different or nothing at all. It's a point-in-time check, not an archive, so schedule it if you need continuity.

**Why do reels show up under Posts as well?**
Instagram puts reels in the main feed and the reels tab both, so the two modes overlap for accounts posting both. Use `userReels` when you specifically want reels; filtering `userPosts` on `media_type` is an approximation.

**Why did I get fewer posts than the account has?**
Either `limit` capped it, or Instagram stopped serving pages. The feed pages through a bounded window rather than a full archive, so old content on a long-lived account can be out of reach. The log says which happened.

**Can I get content from a private account?**
No. Only public accounts, and no session is used.

**What's `has_story` for?**
It flags whether a public story is live at run time. Useful for monitoring — checking which accounts in a list are actively posting stories right now, without pulling the story content itself.

**Does `addonHighlightDetails` affect other modes?**
No. It applies to Highlights only and is ignored elsewhere, so leaving it on won't quietly bill you during a Posts run.

### Other Instagram Actors

| Actor | Use when |
|---|---|
| [Instagram Media Engagement](https://apify.com/toolzerhub/instagram-media-engagement-scraper) | You want comments and likers (needs `code`) |
| [Instagram Hashtag & Keyword Search](https://apify.com/toolzerhub/instagram-hashtag-keyword-scraper) | You're searching by subject, not account |
| [Instagram Followers & Following](https://apify.com/toolzerhub/instagram-profile-follower-followee-scraper) | You want the audience, not the content |
| [Instagram User Search](https://apify.com/toolzerhub/instagram-user-search-scraper) | You don't have account names yet |

### Support

Questions, bugs, or feature requests: **contact@toolzerhub.com**

Browse the rest: [apify.com/toolzerhub](https://apify.com/toolzerhub)

# Actor input Schema

## `profiles` (type: `array`):

Instagram accounts to pull the list from

## `scraperType` (type: `string`):

Which kind of content to collect for each account.

## `limit` (type: `integer`):

Stop after this many rows per account (0 = pull the whole list)

## `addonHighlightDetails` (type: `boolean`):

Swap each highlight-tray row (id/title/cover only) for its full highlight media. Only applies when Content Type is Highlights — adds a billable event per highlight.

## Actor input object example

```json
{
  "profiles": [
    "cristiano"
  ],
  "scraperType": "userPosts",
  "limit": 100,
  "addonHighlightDetails": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

Every record collected during this 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 = {
    "profiles": [
        "cristiano"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("toolzerhub/instagram-profile-content-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 = { "profiles": ["cristiano"] }

# Run the Actor and wait for it to finish
run = client.actor("toolzerhub/instagram-profile-content-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 '{
  "profiles": [
    "cristiano"
  ]
}' |
apify call toolzerhub/instagram-profile-content-scraper --silent --output-dataset

```

## MCP server setup

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