# Instagram Post Scraper (`truefetch/instagram-post-scraper`) Actor

Instagram account post archive for one public profile. Download images and videos and return 64 fields with captions, engagement, owner, tags, location, audio, attribution, and notices.

- **URL**: https://apify.com/truefetch/instagram-post-scraper.md
- **Developed by:** [TrueFetch](https://apify.com/truefetch) (community)
- **Categories:** Social media, Videos, Automation
- **Features:** Limited permissions
- **Stats:** 60 total users, 3 monthly users, 100.0% runs succeeded, 3 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

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

## Instagram Post Scraper

**Instagram Post Scraper is an instagram account post archive that turns one public profile timeline into 64-field records with downloaded images, videos, covers, avatars, and audio artwork, built for developers and data teams.**

- **One profile per run:** use a username, `@handle`, or complete Instagram profile URL.
- **64 documented fields:** Reels, feed images, and image, video, or mixed carousels share one top-level contract.
- **Stored media included:** required post assets are downloaded and uploaded before a Result row is published.
- **Measured prefill:** the `nasa`, two-result example completed in 28.9 seconds with two non-empty Dataset rows on August 12, 2026.

[**Run a one-result test**](https://apify.com/truefetch/instagram-post-scraper) · [**View API**](https://apify.com/truefetch/instagram-post-scraper/api)

The smallest useful test requests one row: $0.01390 on the FREE tier — a $0.01 Actor Start plus one $0.00390 Result. Downloaded media is stored at no separate charge.

### What does Instagram Post Scraper do?

Instagram Post Scraper reads the visible timeline of one known public Instagram account and publishes one record per usable post. A row can represent a Reel, feed image, or image, video, or mixed carousel without forcing downstream code to maintain separate schemas for each format.

Each row combines post and owner identity, caption text, hashtags, mentions, publication time, engagement snapshots, dimensions, stored media, optional location, tagged users with coordinates, coauthors, sponsors, audio, original-content attribution, wearable capture attribution, and public content notices. The Actor downloads required post assets before publication, so `media_items[].mediaUrl` points to Actor storage rather than an expiring source CDN URL.

The Actor begins with a profile identity. It does not accept individual post URLs, discover accounts by keyword, search hashtags, read private profiles, collect Stories, or return a complete comment archive. It is independently operated and is not affiliated with, endorsed by, or sponsored by Instagram or Meta.

### How do I run Instagram Post Scraper?

Start with the prefilled `nasa` account and reduce `max_results` to `1` for the smallest test:

```json
{
  "username": "nasa",
  "max_results": 1
}
```

1. Open the Actor Input tab and enter one username, `@handle`, or profile URL.
2. Set `max_results` to a positive integer; it is a ceiling on saved rows, not a guaranteed count.
3. Start the run and wait for a terminal status.
4. Open the default Dataset and inspect `post_url`, `post_type`, `media_items`, and the storage URLs.
5. Export JSON, CSV, Excel, XML, or another supported Dataset format, or read the Dataset through the API.

A valid run can return fewer rows than requested when a profile is private or unavailable, the visible timeline ends, a candidate lacks required identity, or a required media file cannot be downloaded and stored.

### What data does Instagram Post Scraper return?

Every successfully published Dataset row has 64 top-level fields:

| Group | Fields | Meaning |
| --- | --- | --- |
| Identity | `platform`, `post_id`, `shortcode`, `post_url`, `post_type`, `product_type`, `media_type` | Stable post identity and normalized/source classifications |
| Owner | `owner_id`, `owner_username`, `owner_name`, `owner_url`, `owner_verified`, `owner_avatar` | Public owner context and downloaded avatar |
| Caption | `caption`, `caption_edited`, `caption_lang`, `alt_text`, `hashtags`, `mentions`, `published_at` | Text, source language, accessibility, references, and publish time |
| Engagement | `like_count`, `comment_count`, `play_count`, `duration`, `counts_hidden` | Collection-time counts and video duration |
| Media summary | `width`, `height`, `cover_url`, `media_count`, `image_count`, `video_count`, `is_carousel`, `has_video`, `has_audio` | Dimensions, stored cover, and post composition |
| Place and people | `location_id`, `location_name`, `location_lat`, `location_lng`, `location_address`, `tagged_users`, `coauthors` | Optional place, people tags with coordinates, and collaborators |
| State and attribution | `comments_disabled`, `is_branded`, `sponsors`, `is_pinned`, `is_downloadable`, `is_remixable`, `content_notice`, `attributions`, `capture_info` | Public post state, partnerships, notices, and original/capture context |
| Audio | `audio_type`, `audio_title`, `artist_name`, `audio_id`, `canonical_id`, `audio_ms`, `artwork_url`, `sound_owner`, `audio_reusable`, `audio_trending`, `mashup_count` | Licensed or original-audio identity and availability |
| Assets and provenance | `media_items`, `processor`, `processed_at` | Ordered stored media and Actor processing provenance |

Abbreviated item; a real row contains all 64 top-level fields, and a carousel can contain several `media_items`:

```json
{
  "platform": "instagram",
  "post_id": "3961434691382135949_528817151",
  "shortcode": "Db519z8vcyN",
  "post_url": "https://www.instagram.com/p/Db519z8vcyN/",
  "post_type": "feed_image",
  "owner_username": "nasa",
  "caption": "A public NASA post caption",
  "published_at": "2026-08-01T12:00:00+00:00",
  "like_count": 60309,
  "comment_count": 589,
  "play_count": null,
  "cover_url": "https://api.apify.com/v2/key-value-stores/example/records/cover.jpg",
  "media_count": 1,
  "has_video": false,
  "media_items": [
    {
      "position": 1,
      "media_type": "image",
      "mediaUrl": "https://api.apify.com/v2/key-value-stores/example/records/image.jpg",
      "width": 1080,
      "height": 1080,
      "has_audio": null
    }
  ],
  "processor": "https://apify.com/truefetch/instagram-post-scraper",
  "processed_at": "2026-08-12T12:00:00+00:00"
}
```

Null means the public source did not provide a usable value. Empty arrays mean no matching public elements were present. Counts and state flags are snapshots, not independent verification.

### What inputs can I configure?

Instagram Post Scraper exposes exactly two required inputs in this order:

| Input | Type | Constraints | Prefill |
| --- | --- | --- | --- |
| `username` | string | Username, `@handle`, or one-segment Instagram profile URL; foreign hosts, post routes, explicit ports, spaces, and invalid characters are rejected | `nasa` |
| `max_results` | integer | Positive ceiling on successfully published rows | `2` |

`username` controls both profile resolution and paginated feed requests. `max_results` stops after that many rows have passed identity checks, formatting, media download, storage upload, deduplication, and Dataset publication. Neither input is a hidden filter, and there are no public proxy or concurrency controls.

### What platforms and markets does Instagram Post Scraper cover?

The Actor covers public Instagram profile timelines. It does not apply a country, language, or market filter; a run follows the account identified by `username` and preserves available source language and location signals in the row.

Supported post shapes are Reels, feed images, and image, video, or mixed carousels. Current video timeline items commonly arrive as Reels. Private profiles, Stories, direct messages, follower lists, hashtag results, Explore discovery, and account search are outside the contract.

### Why use Instagram Post Scraper?

- **Stable row shape:** compare post types without joining format-specific tables.
- **Stored post assets:** keep Actor storage URLs for required media instead of source CDN links that can expire.
- **Public context in one record:** combine owner, caption, engagement, location, tags, coauthors, sponsors, audio, attribution, and notices.
- **Partial-run resilience:** one unavailable candidate does not discard usable rows already published.
- **Centralized output accounting:** normalized duplicates are ignored, the result ceiling is enforced before push, and a Result is charged only when the row is saved.

Use the Actor when a known account and post-level records are the correct starting point. Choose a profile lookup when biography and follower totals are the unit, Explore collection when discovery is the goal, or transcript extraction when spoken words are the required output.

### Who is Instagram Post Scraper for?

Developers can feed structured rows into APIs, databases, webhooks, or media pipelines. Analysts can compare formats, captions, engagement, tags, locations, and audio across snapshots. Brand and research teams can schedule small runs for recent content monitoring and reconcile results by `post_id`.

It is not a fit for private-content access, follower or audience discovery, complete historical archives, legal rights clearance, full comments, account-owned publishing, or a workflow that must start from individual post URLs.

### How can I use Instagram Post Scraper through the API or MCP?

The immutable Actor ID is `694ZurZD4xBPBM6oc`; `truefetch/instagram-post-scraper` is the readable name form.

Run synchronously and return Dataset items over HTTP:

```bash
curl -X POST "https://api.apify.com/v2/acts/694ZurZD4xBPBM6oc/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"username":"nasa","max_results":1}'
```

Use the Python client:

```python
from apify_client import ApifyClient

client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("694ZurZD4xBPBM6oc").call(
    run_input={"username": "nasa", "max_results": 1}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["post_url"], item["media_items"])
```

For MCP, add `694ZurZD4xBPBM6oc` to the Actor allowlist of the [Apify MCP server](https://docs.apify.com/integrations/mcp), keep the token in the server environment, and ask the connected client to run the Actor with `username=nasa` and `max_results=1`. The [API page](https://apify.com/truefetch/instagram-post-scraper/api) provides generated JavaScript, Python, CLI, OpenAPI, HTTP, and MCP examples.

### How much does Instagram Post Scraper cost?

Pricing is pay per event, and there are exactly two. The FREE tier charges $0.01 for Actor Start and $0.00390 per Result; downloaded media carries no separate event.

| Event | Billing unit | FREE | BRONZE | SILVER | GOLD / PLATINUM / DIAMOND |
| --- | --- | ---: | ---: | ---: | ---: |
| Result | One complete post row, stored media included | $0.00390 | $0.00351 | $0.00312 | $0.00293 |
| Actor Start | Once per run, memory-scaled | $0.01000 | $0.01000 | $0.01000 | $0.01000 |

One returned row costs $0.01390; two cost $0.01780. Unavailable candidates do not generate a Result event. Set a maximum total charge when a hard run-level ceiling matters, and check the Pricing tab before budgeting a future run.

### How does Instagram Post Scraper compare with alternatives?

Instagram Post Scraper is intentionally narrow: one known public account, post-level rows, and stored media. A broader social collector can cover more discovery modes but introduces a larger input and output surface. A profile API is better for biography and audience totals, while an Explore collector is better for discovering content beyond a known account.

For account-owned, permissioned integrations, compare the workflow with [Meta's official Instagram API documentation](https://www.postman.com/meta/instagram/documentation/6yqw8pt/instagram-api). Manual review remains simpler for one visual check. A custom Actor is appropriate when a different input, legal boundary, storage policy, or Dataset contract is mandatory.

### What are the limits and troubleshooting steps?

- Public timelines only: private, removed, empty, or blocked accounts cannot return public posts.
- `max_results` is a ceiling; source exhaustion and unavailable candidates can reduce output.
- Required post media must download and upload before publication. Optional avatar or artwork failures become null.
- Counts, verification, partnership, reuse, and notice fields reflect the source at collection time.
- The Actor does not collect Stories, full comments, follower lists, search results, private content, or individual post URLs.
- If a run returns zero rows, retry the prefilled `nasa` account with `max_results=1`. Then verify the target profile is public and inspect the terminal status and logs.
- If a scheduled run returns fewer items than the prior snapshot, treat availability and timeline order as source state rather than deleting earlier stored records automatically.

### Frequently asked questions

#### How do I archive Instagram posts from username input?

Provide the account as `username`, set a positive `max_results`, and run the Actor. Each publishable row includes stored post media and a stable `post_id` for downstream archive deduplication.

#### Is Instagram Post Scraper an instagram account post archive for a full history?

It is an archive-building input, not a guarantee of complete history. The Actor follows the currently visible public timeline until `max_results`, feed exhaustion, or the run boundary.

#### Does Instagram Post Scraper collect only Reels?

No. It normalizes Reels, feed images, and image, video, or mixed carousels into the same 64-field contract.

#### Can I pass a profile URL or @handle?

Yes. The runtime normalizes bare usernames, `@handles`, scheme-less `instagram.com/<username>` URLs, and complete HTTP or HTTPS profile URLs. Individual post URLs and foreign hosts are rejected.

#### Are likes, comments, and plays live values?

They are collection-time snapshots. Instagram can change counts after the run, and `play_count` remains null on formats where the source does not expose it.

#### Does a successful run guarantee `max_results` rows?

No. A successful terminal status can accompany fewer rows when the source timeline ends or individual candidates are unavailable.

#### Does the Actor permanently host downloaded media?

The Actor uploads media to the run's Apify Key-Value Store and returns its public storage URLs. Retention and access then follow the storage and account settings that apply to that run.

#### Can I schedule Instagram account monitoring?

Yes. Save the input as an Apify Task, attach a Schedule, request a small recent window, and deduplicate downstream by `post_id` while retaining `processed_at` for snapshot time.

#### Are branded, verified, reusable, or content-notice flags independently checked?

No. They are source-provided signals. Use them as evidence for review, not as legal, identity, rights, or partnership verification.

### Related TrueFetch Actors

These three TrueFetch Actors extend the account-content workflow without duplicating its post archive unit.

- [Instagram Profile API](https://apify.com/truefetch/instagram-profile-api) — collect biography, audience totals, links, and recent profile context instead of full post rows.
- [Instagram Explore Post](https://apify.com/truefetch/instagram-explore-post) — discover content from Instagram Explore rather than starting from a known account.
- [Instagram Video Transcript](https://apify.com/truefetch/instagram-video-transcript) — convert speech from a known Instagram video into transcript output.

### Support

Use the [Store page](https://apify.com/truefetch/instagram-post-scraper) for the product overview, the [API page](https://apify.com/truefetch/instagram-post-scraper/api) for generated integrations, the [Issues page](https://apify.com/truefetch/instagram-post-scraper/issues) for reproducible bugs, and the [TrueFetch community](https://t.me/TrueFetch) for usage questions. Include the run ID and exact non-secret input when reporting a problem.

[**Start with one public post**](https://apify.com/truefetch/instagram-post-scraper) · [**Open the API reference**](https://apify.com/truefetch/instagram-post-scraper/api)

**Last Updated:** August 12, 2026

# Actor input Schema

## `username` (type: `string`):

Enter one Instagram username, @handle, or profile URL. Post URLs and non-Instagram hosts are rejected.

## `max_results` (type: `integer`):

Maximum successfully published Dataset rows. Feed exhaustion, source blocking, or unavailable media can return fewer rows.

## Actor input object example

```json
{
  "username": "nasa",
  "max_results": 2
}
```

# Actor output Schema

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

Browse public Instagram post records with Actor-stored covers, media, avatars, artwork, and normalized post metadata.

# 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 = {
    "username": "nasa",
    "max_results": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("truefetch/instagram-post-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 = {
    "username": "nasa",
    "max_results": 2,
}

# Run the Actor and wait for it to finish
run = client.actor("truefetch/instagram-post-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 '{
  "username": "nasa",
  "max_results": 2
}' |
apify call truefetch/instagram-post-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,truefetch/instagram-post-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/694ZurZD4xBPBM6oc/builds/hBQoiAY7oDPHTPvSL/openapi.json
