# Instagram Profile Posts/Reels | $0.5/1K + Page Fees on Starter (`publicsignallabs/instagram-profile-posts-reels`) Actor

Scrape public Instagram posts and Reels from profiles by username, URL, or ID. Choose all media, posts, or Reels and extract captions, engagement, owner details, media assets, carousels, tags, locations, sponsorships, and audio across bounded profile feeds.

- **URL**: https://apify.com/publicsignallabs/instagram-profile-posts-reels.md
- **Developed by:** [Public Signal Labs](https://apify.com/publicsignallabs) (community)
- **Categories:** Social media, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 media results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 & Reels

Scrape public Instagram posts and Reels from profiles by username, profile URL, or numeric ID. Choose all media, posts only, or Reels only and extract captions, timestamps, engagement, owner details, images, videos, carousels, tags, locations, sponsorships, and audio metadata. Use the data for creator research, content monitoring, campaign analysis, and automated Instagram workflows. No Instagram login, cookies, browser, or proxy setup.

### What this Actor does

- Resolves usernames, profile URLs, and numeric profile IDs
- Fetches cursor-paginated public profile media
- Filters posts and Reels after applying one shared normalized media contract
- Deduplicates media IDs across overlapping pages
- Returns per-profile rank and source identity
- Stops at explicit result and page bounds

### Input

```json
{
  "profiles": ["instagram"],
  "mediaType": "all",
  "resultsLimit": 100,
  "maxPages": 10
}
```

Paying runs accept up to 50 unique profiles, 1,000 results per profile, and 100 pages per profile. `mediaType` is `all`, `posts`, or `reels`.

### Output

Each dataset row uses the portfolio's shared normalized media schema:

| Field group | Fields | Description |
|---|---|---|
| Source and rank | `source_input`, `source_profile_id`, `source_username`, `input_index`, `rank` | Requested profile, resolved identity, deterministic input position, and per-profile result rank. |
| Media identity | `id`, `shortcode`, `url`, `media_type`, `product_type` | Canonical identifiers and normalized post, Reel, video, image, or carousel type. |
| Content | `caption`, `title`, `taken_at`, `accessibility_caption` | Public text, publishing time, and accessibility description. |
| Engagement | `like_count`, `comment_count`, `play_count`, `view_count`, `share_count` | Public engagement counters when Instagram exposes them. |
| Media assets | `display_url`, `video_url`, `width`, `height`, `duration_seconds` | Image/video locations, dimensions, and video duration. |
| Owner | `owner_id`, `owner_username`, `owner_full_name`, `owner_is_verified`, `owner_is_private` | Public owner identity and account flags. |
| Structure and context | `children`, `user_tags`, `coauthors`, `sponsor_tags`, `location`, `audio`, `is_paid_partnership` | Carousel children, relationships, sponsorship, place, and audio metadata. |

Image and video URLs can expire. Ordering and counters can change between runs.

`OUTPUT` contains sanitized per-profile outcomes and exact charge reconciliation. `AUDIT` contains aggregate request and response metrics without profile inputs, cursors, or credentials.

### Pricing

- completed profile lookup: exactly **$0.0035**
- completed valid media page request, including an unavailable/empty response: exactly **$0.0035**
- saved media result: exactly **$0.0005** ($0.50 per 1,000)

Profile feeds require a profile resolution and one or more page requests even when they are empty, private, unavailable, or contain duplicates, and the number of saved rows per page varies. Separate profile, page, and result events keep charges aligned with completed work; a single result event would make empty and low-yield requests consume upstream work without covering it.
The title's **$0.5/1K** is the exact result event, not the all-in total; profile and page fees always apply. Exact examples:

| Work completed | Exact charge |
|---|---:|
| 1 profile + 1 page + 1 result | $0.0075 |
| 1 profile + 1 page + 12 results | $0.0130 |
| 1 profile + 3 pages + 100 results | $0.0640 |

Every total is computed as `profiles × $0.0035 + pages × $0.0035 + results × $0.0005`. The Actor refuses remote execution if configured event prices differ from these displayed rates.

### FREE demo

Five runs per account per UTC month. Each FREE run accepts exactly one profile, one page, and up to 20 results. The shared quota is enforced before upstream work and fails closed when identity or quota storage is unavailable.

### Limits and responsible use

- Public profile media only; private or unavailable profiles can return no rows
- A completed profile lookup is billable even when no page can be returned
- A completed page request with a valid empty or unavailable response is billable
- No continuation token is exposed in this version
- This Actor fetches profile feed posts/Reels, not Tagged-tab posts or textual mentions

Use responsibly and comply with applicable laws, platform terms, and privacy obligations. This Actor is not affiliated with or endorsed by Instagram or Meta.

# Actor input Schema

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

Instagram usernames, profile URLs, or numeric IDs. Paying runs accept up to 50 unique values.

## `mediaType` (type: `string`):

Return all feed media, posts only, or Reels only.

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

Maximum unique rows per profile. FREE runs allow up to 20.

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

Hard pagination bound. FREE runs require 1.

## Actor input object example

```json
{
  "profiles": [
    "instagram"
  ],
  "mediaType": "all",
  "resultsLimit": 100,
  "maxPages": 10
}
```

# Actor output Schema

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

Normalized public Instagram profile media from the default dataset.

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

Run status, delivered totals, pricing, and sanitized per-profile outcomes.

## `audit` (type: `string`):

Aggregate request, usage, storage, charge, and FREE admission metrics without input values or credentials.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("publicsignallabs/instagram-profile-posts-reels").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("publicsignallabs/instagram-profile-posts-reels").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 '{}' |
apify call publicsignallabs/instagram-profile-posts-reels --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,publicsignallabs/instagram-profile-posts-reels"
        }
    }
}

```

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/R7jX7h1ieD0RaYR1S/builds/iawVhE9hfj1kvAjka/openapi.json
