# Instagram Post Details Scraper – Data Export (`scrapingmonkey/instagram-post-details`) Actor

Extract public Instagram post details from full URLs. Get images, Reels, carousels, captions, engagement, authors, tags, locations, and direct media URLs.

- **URL**: https://apify.com/scrapingmonkey/instagram-post-details.md
- **Developed by:** [ScrapingMonkey](https://apify.com/scrapingmonkey) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

Extract complete public Instagram post details from a URL. **Instagram Post Scraper** recognizes image posts, Reels, legacy videos, and carousels, then returns normalized media, caption, author, engagement, location, tags, and collaboration data in one dataset row.

It is the flexible choice when your input list contains different Instagram post types. No Instagram login or cookies are required, and each submitted URL is preserved with an explicit `success` or `failed` status.

| At a glance | Details |
|---|---|
| 📥 Input | Full Instagram `/p/`, `/reel/`, or `/tv/` URLs |
| 📤 Output | Post type, media URLs, caption, counts, author, location, carousel children, tags, and sponsors |
| 🔐 Login required | No |
| ⚡ Processing | Up to 5 URLs concurrently with automatic retries |
| 💾 Delivery | One Apify dataset row per unique post URL |

### What the Instagram post scraper extracts 🔎

The Actor resolves a public Instagram link and adapts its output to the underlying media type. Single images expose image variants, Reels expose video and playback fields, and carousel posts include an ordered `carousel_media` array.

The normalized result covers:

- ID, PK, shortcode, canonical URL, post type, product type, and media type
- Caption text, caption ID, timestamps, translation flag, and edit flag
- Likes, comments, views, plays, Instagram plays, Facebook counts, and reposts when available
- Image, thumbnail, video, duration, dimensions, and accessibility caption
- Author, location, tagged users, coauthors, and sponsors
- Image and video variants
- Carousel child count and ordered child media
- Audio, comments, hidden-count, partnership, and resharing flags

### How to scrape Instagram post details 🚀

1. Copy full public Instagram post URLs.
2. Paste them into `inputList`.
3. Start the Actor.
4. Filter the dataset by `type`, `status`, author, or engagement fields.
5. Export or integrate the structured results.

```json
{
  "inputList": [
    "https://www.instagram.com/p/DcVY5dZm_Pv/",
    "https://www.instagram.com/reel/DctPchKOVcw/"
  ]
}
```

Bare shortcodes are not accepted. Use the complete Instagram URL so the dataset always retains the original user input.

### Post details data fields 📦

| Field group | Included data |
|---|---|
| Identity | `id`, `pk`, `code`, `url`, `type`, `product_type`, `media_type` |
| Caption | Text, ID, timestamps, translation and edit state |
| Engagement | Likes, comments, views, plays, Facebook counts, reposts |
| Media | Image, thumbnail, video, duration, dimensions, variants |
| Relationships | Author, location, tagged users, coauthors, sponsors |
| Carousel | Child count and complete ordered media array |
| Flags | Audio, comments disabled, counts hidden, paid partnership, resharing |

Complete representative success item:

```json
{
  "input": "https://www.instagram.com/reel/DctPchKOVcw/",
  "status": "success",
  "image_url": "https://instagram.example/reel-cover.jpg",
  "url": "https://www.instagram.com/reel/DctPchKOVcw/",
  "id": "1234567890123456789_13460080",
  "pk": "1234567890123456789",
  "code": "DctPchKOVcw",
  "type": "reel",
  "product_type": "clips",
  "media_type": 2,
  "caption": "An example public Reel",
  "caption_id": "987654321",
  "caption_timestamp": 1754006400,
  "caption_published_at": "2025-08-01T00:00:00Z",
  "caption_has_translation": false,
  "caption_is_edited": false,
  "published_at": "2025-08-01T00:00:00Z",
  "timestamp": 1754006400,
  "like_count": 24500,
  "comment_count": 410,
  "view_count": 340000,
  "play_count": 352000,
  "instagram_play_count": 350000,
  "facebook_like_count": 0,
  "facebook_comment_count": 0,
  "repost_count": 97,
  "thumbnail_url": "https://instagram.example/reel-thumbnail.jpg",
  "video_url": "https://instagram.example/reel-video.mp4",
  "video_duration": 12.8,
  "width": 1080,
  "height": 1920,
  "accessibility_caption": null,
  "has_audio": true,
  "comments_disabled": false,
  "commenting_disabled_for_viewer": false,
  "counts_hidden": false,
  "is_paid_partnership": false,
  "can_reshare": true,
  "author": {
    "profile_picture_url": "https://instagram.example/author.jpg",
    "profile_picture_url_hd": "https://instagram.example/author-hd.jpg",
    "username": "nike",
    "name": "Nike",
    "id": "13460080",
    "pk": "13460080",
    "profile_url": "https://www.instagram.com/nike/",
    "is_verified": true,
    "is_private": false
  },
  "location": null,
  "image_versions": [
    {
      "url": "https://instagram.example/reel-cover-1080.jpg",
      "width": 1080,
      "height": 1920
    }
  ],
  "video_versions": [
    {
      "url": "https://instagram.example/reel-video-1080.mp4",
      "width": 1080,
      "height": 1920,
      "type": 101
    }
  ],
  "carousel_media_count": 0,
  "carousel_media": [],
  "tagged_users": [
    {
      "id": "2002",
      "pk": "2002",
      "username": "examplecreator",
      "name": "Example Creator",
      "profile_url": "https://www.instagram.com/examplecreator/",
      "profile_picture_url": "https://instagram.example/tagged.jpg",
      "is_verified": false,
      "position": [0.5, 0.5]
    }
  ],
  "coauthors": [
    {
      "id": "3003",
      "pk": "3003",
      "username": "partnerbrand",
      "name": "Partner Brand",
      "profile_url": "https://www.instagram.com/partnerbrand/",
      "profile_picture_url": "https://instagram.example/coauthor.jpg",
      "is_verified": true
    }
  ],
  "sponsors": [
    {
      "id": "4004",
      "pk": "4004",
      "username": "sponsorbrand",
      "name": "Sponsor Brand",
      "profile_url": "https://www.instagram.com/sponsorbrand/",
      "is_verified": true
    }
  ]
}
```

For a carousel success row, `carousel_media` contains ordered children with `position`, identity, type, media URLs, duration, dimensions, accessibility text, image variants, video variants, product type, timestamps, likes, and tagged users.

A failed row uses the same top-level schema: `input` is retained, `status` is `failed`, and all 45 post-data fields are `null`. This makes bad inputs visible while avoiding fabricated partial data.

### Input requirements and supported links ⚙️

| Parameter | Type | Required | Rules |
|---|---|---|---|
| `inputList` | array of strings | Yes | At least one full Instagram post, Reel, or TV URL |

Supported path forms include `/p/SHORTCODE/`, `/reel/SHORTCODE/`, and `/tv/SHORTCODE/`. The resolved media determines `type`; the URL path alone is not trusted as the final classification.

Malformed values fail immediately. Duplicate posts are deduplicated through the request queue. A bad item does not stop valid URLs in the same run.

### Instagram post scraping use cases 🎯

#### Unified content ingestion

Process mixed image, carousel, and video links without building a different parser for every content type.

#### Campaign reporting

Collect public captions, engagement, partnership flags, collaborators, and sponsors for selected posts.

#### Media and creative analysis

Feed dimensions, media URLs, variants, accessibility text, and post type into classification or review systems.

#### Content databases

Store canonical post IDs and shortcodes alongside author and publication data for deduplication and later enrichment.

#### Moderation and compliance review

Export public captions, media references, tags, and relationship metadata for authorized human or automated analysis.

### Pricing and billable rows 💰

Check the Actor's **Pricing** tab for the current pricing model and rate. Store pricing is configurable and is not hard-coded in this documentation.

Under dataset-item pricing:

- Every successfully parsed post saves one billable `success` row.
- Every unique invalid, unavailable, deleted, restricted, or unresolved URL saves one `failed` row.
- A carousel remains one row even when it contains many child items.
- Automatic retry attempts do not create extra dataset rows.

The number of saved rows therefore normally follows the number of unique submitted posts, not the number of media files nested inside them.

### Instagram post details API 🔌

Replace `$ACTOR_ID` with the Actor ID from the API tab and `$APIFY_TOKEN` with your token.

```bash
curl -X POST "https://api.apify.com/v2/acts/$ACTOR_ID/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"inputList":["https://www.instagram.com/reel/DctPchKOVcw/"]}'
```

Use Apify schedules for recurring collection, webhooks for completion events, and dataset integrations for Google Sheets, Make, Zapier, cloud storage, or custom ETL jobs.

### Reliability, retries, and limits ⚠️

Up to five post requests run concurrently. Temporary timeouts, throttling, selected HTTP errors, login redirects, and transport failures are retried automatically. Permanent input mistakes and confirmed unavailable responses become failed rows rather than repeatedly consuming the whole run.

Public Instagram content can change or disappear. Private, deleted, age-restricted, region-restricted, or login-gated posts may not be retrievable. Some public fields are optional and legitimately return `null`, `0`, or an empty array.

One failed post should not crash a mixed batch. Infrastructure failures can still fail the whole run, including startup failure, unavailable Apify storage, or an unrecoverable error while saving a dataset item.

### Frequently asked questions ❓

#### Does it support Reels and carousels?

Yes. It normalizes ordinary image posts, Reels, legacy TV videos, and carousel containers.

#### Do I need the shortcode or the full URL?

Submit the full URL. Bare shortcodes are intentionally not accepted.

#### Does the Actor download media?

No. It returns public direct media URLs when exposed. Those CDN URLs can expire.

#### Why is an engagement count null?

Instagram may hide counts or omit specific metrics for a post. Null means the source did not provide a reliable value.

#### When should I use the dedicated Reel or Carousel Actor?

Use a dedicated Actor when you want strict type validation or type-specific fields such as detailed audio metadata. Use this Actor for mixed links and a common schema.

#### Can I export carousel items to CSV?

Yes, but JSON preserves nested arrays most faithfully. A later transformation can flatten child items into separate rows if required.

### Support, responsible use, and related actors 🛟

For support, share the run ID, approximate time, and a safe public example URL. Never post tokens, cookies, or proxy credentials.

Use the Actor for lawful collection of public data. Respect copyright, privacy, data-protection, contractual, and platform obligations when storing, analyzing, or redistributing results.

# Actor input Schema

## `inputList` (type: `array`):

Add one full Instagram /p/, /reel/ or /tv/ URL per item. Only complete Instagram links are accepted; shortcodes are not supported. Unavailable posts and links that cannot be processed are saved with failed status.

## Actor input object example

```json
{
  "inputList": [
    "https://www.instagram.com/reel/DctPchKOVcw/"
  ]
}
```

# Actor output Schema

## `posts` (type: `string`):

One dataset row for every processed unique post. Check the status field to distinguish successfully extracted posts from failed 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 = {
    "inputList": [
        "https://www.instagram.com/reel/DctPchKOVcw/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapingmonkey/instagram-post-details").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 = { "inputList": ["https://www.instagram.com/reel/DctPchKOVcw/"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapingmonkey/instagram-post-details").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 '{
  "inputList": [
    "https://www.instagram.com/reel/DctPchKOVcw/"
  ]
}' |
apify call scrapingmonkey/instagram-post-details --silent --output-dataset

```

## MCP server setup

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

```

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/rHTNAnyHHb6Ja00Q8/builds/Q7eAS0xauNMT2O2Xe/openapi.json
