# Instagram Posts Scraper for Public Profiles (`datascraperes/instagram-public-posts-scraper`) Actor

Scrape Instagram posts, Reels, videos, and carousels from public profiles. No login. Tiered pricing from $1 to $0.75 per 1,000 posts delivered.

- **URL**: https://apify.com/datascraperes/instagram-public-posts-scraper.md
- **Developed by:** [DataScraperES](https://apify.com/datascraperes) (community)
- **Categories:** Social media, Marketing
- **Features:** Limited permissions
- **Stats:** 13 total users, 3 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.75 / 1,000 instagram posts

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

Collect images, videos, carousels, and optionally Reels from public Instagram profile timelines without providing a login. Submit usernames or profile URLs and receive one structured Dataset row per unique delivered post, with caption, engagement, media, owner, tags, location, and source-profile context.

### What this Actor does

The Actor normalizes and deduplicates public profile inputs, paginates their public timelines, and deduplicates media by ID across the run. It can include timeline Reels or restrict results to non-Reel timeline media. A free profile report explains the processing state of every submitted profile.

### Use cases

- Archive public content metadata for creator or brand research.
- Monitor posting activity, formats, captions, hashtags, and engagement.
- Build datasets for competitive analysis, reporting, or content discovery.

### How to use

1. Open the Actor in Apify Console.
2. Add one or more public Instagram profiles.
3. Set total and per-profile post limits and choose whether to include Reels.
4. Click **Start** and open the Dataset when the run finishes.

### Input

`profiles` accepts 1–10,000 usernames, @handles, or public profile URLs. `resultsLimit` defaults to 1,000 and accepts 1–100,000 across the run. `maxPostsPerProfile` defaults to 100 and accepts 1–10,000 per profile. `includeReels` defaults to `true`. Duplicate profiles are skipped.

This exact input produced the complete output below:

```json
{
  "profiles": [
    "nasa"
  ],
  "resultsLimit": 1,
  "maxPostsPerProfile": 1,
  "includeReels": true
}
```

### Output

Every Dataset row represents one unique media ID and can be an `image`, `video`, `carousel`, or `reel`. Fields include shortcode, canonical URL, caption, hashtags, mentions, timestamp, display/video URLs, dimensions, engagement, audio/partnership/pinned flags, owner, location, coauthors, tagged users, carousel children, source profile, and scrape time. `SUMMARY` reports run totals and `PROFILE_REPORT` reports each input's processing status.

This is the complete Dataset item from a real successful run:

```json
{
  "schemaVersion": 1,
  "id": "3967213292204992434",
  "shortCode": "DcOX3hWFiey",
  "url": "https://www.instagram.com/p/DcOX3hWFiey/",
  "type": "image",
  "productType": "feed",
  "caption": "With your powers combined…\n\nThis colorful picture of the cosmos is the product of teamwork between our @NASAHubble, @NASAWebb, and @NASAChandraXray telescopes. Scientists brought their data together to get a vibrant look at this star-forming region known as the Tarantula Nebula, located 160,000 light-years from Earth.\n\nChandra’s X-ray data fills in the deep blue parts of the image, showing the gas blown away by the stellar winds created by the nebula’s young stars. Webb’s infrared data shows up as red, displaying the thousands of stars and the dust that gives rise to them. Hubble’s visible data is represented in green, showing warmer gas and other stars.\n\nCredit: NASA\n\n#NASA #Universe #Nebula",
  "hashtags": [
    "NASA",
    "Universe",
    "Nebula"
  ],
  "mentions": [
    "NASAHubble",
    "NASAWebb",
    "NASAChandraXray"
  ],
  "timestamp": "2026-08-19T14:11:47+00:00",
  "displayUrl": "https://instagram.ffru1-4.fna.fbcdn.net/v/t51.82787-15/780550892_18639053554049152_7611034912661011809_n.jpg?stp=dst-jpg_e35_tt6&_nc_cat=1&ig_cache_key=Mzk2NzIxMzI5MjIwNDk5MjQzNA%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkZFRUQueHBpZHMuMTI4MC5zZHIucmVndWxhcl9waG90by5DMyJ9&_nc_ohc=7OKvUFcmaKEQ7kNvwGHVYpH&_nc_oc=AdojlRpczuMO429NuHzOzS_UsbrbyRr82ULZ6rfmTSZAUuhm7HO4IEhOUNGYQoe57_Q&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=instagram.ffru1-4.fna&_nc_gid=XhlttZLKHOz3ImbXTCZC0Q&_nc_ss=7a22e&oh=00_AQGu6GiQ7KzOBBBJzuKza6fntuM8z5zEXU-7NXj53Hwglw&oe=6A91ADF6",
  "videoUrl": null,
  "width": 1280,
  "height": 1129,
  "likesCount": 391577,
  "commentsCount": 2685,
  "videoViewsCount": null,
  "videoPlaysCount": null,
  "videoDurationSeconds": null,
  "hasAudio": false,
  "isPaidPartnership": false,
  "isPinned": true,
  "accessibilityCaption": null,
  "owner": {
    "id": "528817151",
    "username": "nasa",
    "fullName": "NASA",
    "isVerified": true,
    "isPrivate": false,
    "profilePicUrl": "https://instagram.ffru1-4.fna.fbcdn.net/v/t51.2885-19/29090066_159271188110124_1152068159029641216_n.jpg?stp=dst-jpg_s150x150_tt6&efg=eyJ2ZW5jb2RlX3RhZyI6InByb2ZpbGVfcGljLmRqYW5nby4xMDgwLmMyIn0&_nc_ht=instagram.ffru1-4.fna.fbcdn.net&_nc_cat=1&_nc_oc=Q6cZ2gHyq2w7kfZPNLWbHR696Gn9ukaziBiwGBR3E3ttZr6LU9nqOaI5VhzhmF5_ZyD3DhI&_nc_ohc=SCBbWOfqcPsQ7kNvwHq8y8x&_nc_gid=XhlttZLKHOz3ImbXTCZC0Q&edm=AP4sbd4BAAAA&ccb=7-5&oh=00_AQHaVIBB611YuSeUPATMHDPvfJM8ZNwckHN2P4klQwgEZw&oe=6A91B069&_nc_sid=7a9f4b"
  },
  "location": null,
  "coauthors": [],
  "taggedUsers": [],
  "carousel": [],
  "sourceUsername": "nasa",
  "sourceProfileUrl": "https://www.instagram.com/nasa/",
  "scrapedAt": "2026-08-24T07:36:28.568984+00:00"
}
```

Results can be exported as JSON, JSONL, CSV, Excel, XML, or RSS.

### Pricing

The Actor uses tiered pay-per-event pricing. One successfully delivered unique media row maps to one `post-result` event.

| Apify account tier | Price per post | Price per 1,000 posts |
|---|---:|---:|
| Free | $0.001 | $1.00 |
| Bronze | $0.0009 | $0.90 |
| Silver | $0.0008 | $0.80 |
| Gold | $0.00075 | $0.75 |
| Platinum | $0.00075 | $0.75 |
| Diamond | $0.00075 | $0.75 |

Duplicate media, duplicate or invalid profiles, private or unavailable profiles, failed requests, excluded Reels, and free summary/report records are not charged. `resultsLimit` caps delivered posts, and Apify's maximum run charge provides an additional spending limit.

### Related Actors

| Actor | Best for |
|---|---|
| [Instagram Comments Scraper - No Login](https://apify.com/datascraperes/instagram-comments-scraper) | Collecting public conversations from posts returned by this Actor. |
| [Instagram Reels Scraper for Public Profiles](https://apify.com/datascraperes/instagram-public-reels-scraper) | Running a Reel-only collection with Reel-specific audio and media fields. |
| [Instagram Profile Scraper - No Login](https://apify.com/datascraperes/instagram-profile-scraper-no-login) | Adding biography, follower, verification, and business context to source profiles. |

### Limits and data quality

Temporary request failures are retried within a bounded recovery budget. If a profile remains unavailable, the Actor continues with other profiles and preserves saved posts. Check `PROFILE_REPORT` and `SUMMARY.collectionComplete`: a `Stopped` message and `SUMMARY.partial: true` indicate an incomplete collection, even when the run finishes without an error. Storage, configuration or billing inconsistencies can still require an error to protect your results and charges.

The Actor accepts up to 10,000 profiles, 100,000 total posts, and 10,000 posts per profile. Limits are maxima, not guarantees. Only public timeline content exposed during the run is available. Temporary access and network responses are retried with session recovery; a profile that remains unavailable is reported in `PROFILE_REPORT` without creating a Dataset row or charge. Engagement counts are snapshots; media URLs are hosted by Instagram and can expire. Private, deleted, restricted, or unavailable profiles cannot produce public post rows.

### Frequently asked questions

#### Can I exclude Reels?

Yes. Set `includeReels` to `false` to keep public images, videos, and carousels from the profile timeline.

#### Why does a carousel create one charged row?

The carousel has one unique parent media ID. Its child media are contained in the row's `carousel` array rather than billed as separate posts.

### Responsible use

Use public Instagram content only for lawful purposes. Respect Instagram's terms, privacy and data-protection laws, copyright, creator rights, and applicable retention requirements. Media URLs do not transfer ownership or permission to republish content.

### Support

Open an issue in the Actor's **Issues** tab with the run ID, a reproducible public profile, selected limits, and the relevant `PROFILE_REPORT` status. Never include credentials or tokens.

# Changelog

This Actor's version history is a separate document: https://apify.com/datascraperes/instagram-public-posts-scraper/changelog.md

# Actor input Schema

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

Usernames, @handles, or complete public Instagram profile URLs. Duplicate profiles are skipped and never fetched or charged twice.

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

Maximum number of unique posts returned across the entire run. This is the primary protection for bulk jobs and maximum spend.

## `maxPostsPerProfile` (type: `integer`):

Maximum unique posts attributed to each submitted profile. Pagination stops separately for every profile at this limit.

## `includeReels` (type: `boolean`):

When enabled, Reels present in each public profile timeline are returned as posts. Disable it to keep images, videos, and carousels only.

## Actor input object example

```json
{
  "profiles": [
    "nasa"
  ],
  "resultsLimit": 5,
  "maxPostsPerProfile": 5,
  "includeReels": true
}
```

# Actor output Schema

## `results` (type: `string`):

Every dataset row is one unique successfully delivered post and maps to one post-result event.

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

Delivered-post, billing, duplicate, limit, status, duration, and completion totals.

## `profileReport` (type: `string`):

A free status record for every submitted profile, including invalid, duplicate, unavailable, and completed inputs.

# 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": [
        "nasa"
    ],
    "resultsLimit": 5,
    "maxPostsPerProfile": 5,
    "includeReels": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("datascraperes/instagram-public-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 = {
    "profiles": ["nasa"],
    "resultsLimit": 5,
    "maxPostsPerProfile": 5,
    "includeReels": True,
}

# Run the Actor and wait for it to finish
run = client.actor("datascraperes/instagram-public-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 '{
  "profiles": [
    "nasa"
  ],
  "resultsLimit": 5,
  "maxPostsPerProfile": 5,
  "includeReels": true
}' |
apify call datascraperes/instagram-public-posts-scraper --silent --output-dataset

```

## MCP server setup

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