# Instagram Post & Reel Details Scraper — Likes, Exact Time (`foxlabs/instagram-post-details-scraper`) Actor

Instagram posts and reels by URL: likes, comments, exact publish time, caption, hashtags, carousel parts, tagged accounts, co-authors, location, the owner's follower count, engagement rate. Reels: length, music, and the play count while a reel is among its owner's 36 newest or pinned. No login.

- **URL**: https://apify.com/foxlabs/instagram-post-details-scraper.md
- **Developed by:** [Berkan Kaplan](https://apify.com/foxlabs) (community)
- **Categories:** Social media, Marketing
- **Stats:** 4 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 post details

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?

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 & Reel Details Scraper — Likes, Views, Engagement 🚀

**foXLabs Instagram series:** [Bulk Profile](https://apify.com/foxlabs/instagram-profile-scraper) · [Profile Posts](https://apify.com/foxlabs/instagram-profile-posts-scraper) · [Comments](https://apify.com/foxlabs/instagram-comments-scraper) · [Reels](https://apify.com/foxlabs/instagram-reels-scraper)

🎉 Give a list of Instagram post and reel addresses; get one row per post: **likes, comment count, exact publish time, caption with hashtags & mentions**, the kind, carousel parts, tagged accounts, co-authors, location and topics, and the owner's exact **follower count with an engagement rate**. For videos/reels also length and sound; for a reel two counters — the Reels-tab **play count** (when it's among the first 36 tiles) and the embed-page **view count**.

**It reads only what a signed-out visitor sees.** No login, no cookies, nothing from your own Instagram account. Not affiliated with Instagram or Meta.

### 🔍 What is the Instagram Post & Reel Details Scraper — and when should you use it?

Give this Actor post/reel URLs and it returns one rich row each — built for campaign reports ("what did these 300 posts do?"), following the same posts day by day, and reading a post's full content.

**Use it when you need:** engagement + exact time for a known list of posts/reels; a campaign performance report with engagement rate; or reel play counts and video views.

**Use something else when:** you want a whole profile's posts → [Profile Posts](https://apify.com/foxlabs/instagram-profile-posts-scraper); profile-level metrics → [Bulk Profile](https://apify.com/foxlabs/instagram-profile-scraper); the comments themselves → [Comments](https://apify.com/foxlabs/instagram-comments-scraper).

### 🤖 Use with AI agents

**Already on the Apify MCP server?** Ask for this Actor by name: `foxlabs/instagram-post-details-scraper`. An agent can discover it, run it and read the dataset over MCP.

**Real-time Standby API.** The code also runs as a small API — `GET /post?url=<address>` returns one post per request, with `includeVideoStats` and `includeReelPlays` as optional parameters — billed with the same `post-details` event.

Otherwise paste this into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

```
I want Instagram post/reel details using the Apify Actor
`foxlabs/instagram-post-details-scraper`.

Input: `postUrls` is a list of post/reel URLs, short codes or ids; `includeVideoStats` adds
view count + follower count + engagement rate; `includeReelPlays` adds the Reels-tab play count.
Each row has likeCount, commentCount, takenAt, ownerFollowers, engagementRate, playCount.

Start with:
{ "postUrls": ["https://www.instagram.com/reel/DePpLegAuKI/"] }

Ask me which posts to measure, run the Actor, then summarise the engagement.
```

The machine-readable API, MCP config and OpenAPI definition live at `apify.com/foxlabs/instagram-post-details-scraper.md`.

### 📋 Overview

Everything you need to turn a list of Instagram post/reel links into clean, structured data — engagement, exact time, full content and follower-based engagement rate — in one Actor, with no login, cookies or account.

**Why teams pick this Actor:**

- ✅ **Engagement rate** — likes + comments ÷ the owner's exact follower count.
- 🎬 **Two reel counters, honestly** — Reels-tab `playCount` and embed `videoViewCount` are different; both given, never confused.
- 📅 **Exact time + full content** — caption, carousel parts, tags, co-authors, topics, music.
- 🎯 **Honest nulls** — a value Instagram didn't give is `null`, never 0; every `…Source` says where a figure came from.
- 💰 **Pay only for results** — one `post-details` event per row; status rows and duplicates free.
- 🤖 **Agent-ready** — MCP + a real-time Standby API.

### ✨ Features

- 🔍 **Posts & reels by URL** — any address form, short code or numeric id; duplicates delivered once.
- 📊 **Engagement** — likeCount (+ hidden flag), commentCount (+ disabled flag), ownerFollowers, engagementRate.
- ▶️ **Reel counters** — `playCount` (Reels tab, first 36 tiles) and `videoViewCount` (embed).
- 🧩 **Full content** — caption, hashtags, mentions, co-authors, tagged users, carousel media, topics, location, video URL + music.

### 🎬 Quick Start

```bash
curl -X POST "https://api.apify.com/v2/acts/foxlabs~instagram-post-details-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"postUrls": ["https://www.instagram.com/reel/DePpLegAuKI/"]}'
```

### 🚀 Getting Started (3 steps)

1. **Paste your posts** — one per line: a post/reel URL, short code or numeric id.
2. **Pick depth** — keep `includeVideoStats`/`includeReelPlays` on for views/plays/engagement, or off for one request per post.
3. **Run and export** — get a clean dataset as JSON, CSV or Excel.

### 📥 Input

| Field | Default | What it does |
|---|---|---|
| `postUrls` | required | One post/reel per line: any address form, short code or numeric id; duplicates delivered once. |
| `includeVideoStats` | true | Adds `videoViewCount`, `ownerFollowers`, `engagementRate` (one embed request per video/carousel; a photo's follower count read once per owner). |
| `includeReelPlays` | true | Adds `playCount` for reels (reads the owner's Reels tab, 1–3 pages per owner). |
| `maxPosts` | 100000 | Stop after this many rows. |
| `proxyConfiguration` | auto | Nothing to change for normal use. |

```json
{ "postUrls": ["https://www.instagram.com/p/DeNRLCCF4kk/", "https://www.instagram.com/reel/DdB9sMlAsb8/"] }
```

### 📤 Output

One row per post, in the order of your lines (`postId` unique per run). A value Instagram didn't give is `null`, never 0.

| Field | Meaning |
|---|---|
| `type`, `postId`, `shortCode`, `url`, `productType` | kind, ids, address |
| `ownerUsername`, `ownerUserId`, `ownerFullName`, `ownerIsVerified` | the account |
| `takenAt` | exact publish time (UTC) |
| `likeCount`, `likesHidden`, `commentCount`, `commentsDisabled` | engagement |
| `playCount`, `videoViewCount` | Reels-tab plays (first 36 tiles) and embed views — **different counters** |
| `ownerFollowers`, `engagementRate` | exact followers; (likes + comments) ÷ followers |
| `caption`, `captionIsEdited`, `hashtags`, `mentions`, `coauthors`, `taggedUsers`, `topics` | content |
| `locationName/Id/Lat/Lng`, `carouselCount`, `carouselMedia` | place; carousel parts |
| `durationSeconds`, `hasAudio`, `videoUrl`, `musicArtist`, `musicTitle`, `usesOriginalAudio` | video/sound |
| `displayUrl`, `width`, `height`, `accessibilityCaption`, `isAiLabeled` | media |
| `playCountSource`, `videoStatsSource`, `ownerFollowersSource` | where each figure came from |
| `input`, `scrapedAt`, `error` | your line; when read; reason on status rows |

```json
{
  "type": "reel", "shortCode": "DePpLegAuKI", "url": "https://www.instagram.com/reel/DePpLegAuKI/",
  "ownerUsername": "natgeo", "ownerFollowers": 268420490, "takenAt": "2026-10-08T19:05:31.000Z",
  "likeCount": 47878, "commentCount": 163, "playCount": 983213, "videoViewCount": 228112,
  "engagementRate": 0.00018, "caption": "Many orphaned giant anteater pups …",
  "durationSeconds": 9.258, "musicArtist": "natgeo", "musicTitle": "Original audio",
  "playCountSource": "reels-tab", "videoStatsSource": "embed", "ownerFollowersSource": "embed"
}
```

### 💼 Use cases

**1. Campaign report** — "what did these 300 posts do?" with engagement rate.
*Input:* the campaign URLs, everything on. *Output:* likes/comments/views + rate. *Use:* one report table.

**2. Daily tracking** — follow the same posts on a schedule for fresh numbers.
*Input:* the URLs, scheduled. *Output:* a row per run. *Use:* a performance timeline.

**3. Reel benchmarking** — compare plays and views across reels.
*Input:* reel URLs. *Output:* `playCount` + `videoViewCount`. *Use:* judge true reach.

### 🔗 Integration

**JavaScript / Node.js**

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('foxlabs/instagram-post-details-scraper').call({ postUrls: ['https://www.instagram.com/reel/DePpLegAuKI/'] });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

**Python**

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')
run = client.actor('foxlabs/instagram-post-details-scraper').call(run_input={'postUrls': ['https://www.instagram.com/reel/DePpLegAuKI/']})
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)
```

Written for `apify-client` 3 for Python, where `call()` returns a run object; with version 1 or 2 it returns a dict — write `run['defaultDatasetId']` there.

**Automation (n8n / Zapier / Make):** schedule → HTTP request to the Actor API with your `postUrls` → handle the JSON dataset → push to a sheet, CRM or dashboard.

### 📊 Pricing

Pay per event, one per delivered row: **`post-details`**. Free: status rows, second addresses of the same post, and a run that could not start. [View current pricing.](https://apify.com/foxlabs/instagram-post-details-scraper)

### ❓ FAQ

**Do I need an Instagram login or cookies?** No — only what a signed-out visitor sees.

**What's the difference between `playCount` and `videoViewCount`?** Two counters: the Reels-tab play figure and the embed page's views (plays ran 2.2–7.7× the views in our measurements). Never report one as the other.

**Why is `playCount` sometimes null?** It's only available while a reel is among the first 36 tiles of its owner's Reels tab; older reels show `null` (likes/comments/views still come).

**How is engagement rate computed?** (likes + comments) ÷ the owner's exact follower count; `ownerFollowersSource` says whether that came from the embed page or the profile.

**Can I export to CSV / Excel / JSON?** Yes — directly from the Apify dataset.

### 🐛 Troubleshooting / What it does NOT do

- **No share/save/repost counts, no comments** (count only) — not in what a signed-out visitor gets.
- **No play count below tile 36** of the owner's Reels tab → `playCount: null`.
- **Nothing behind the login** — private posts, signed-in-only posts, stories, follower lists (free status row).
- **No share links** (`instagram.com/share/…`) — open it and use the address it leads to.
- **No media files** — `displayUrl`/`videoUrl`/`carouselMedia` are temporary addresses.
- **No only-new memory** — every run delivers every post with fresh numbers.
- **A changed Instagram query** fails the run at its start-up request, before anything is read/charged.

### ⚠️ Trademark

Independent, third-party tool. Not affiliated with, endorsed by or connected to Instagram or Meta Platforms, Inc. "Instagram" and related marks belong to their owners and are used here for identification only.

### ⚖️ Is it legal to scrape this data?

Rows describe public posts but can hold personal data (owner name/id, tagged accounts, co-authors, location); you decide what to collect and are responsible for a lawful reason (GDPR and similar). The Actor infers nothing about a person, delivers no comments/commenters, and writes only to your own run's storage. Media belongs to its owners; addresses are temporary. See Apify's blog post on the legality of web scraping.

### 🤝 Support & contact

- 🌐 **Website:** [data.foxlabs.com.tr](https://data.foxlabs.com.tr)
- 📧 **Email:** info@foxlabs.com.tr
- 🐛 **Issues:** open a ticket in the Actor's **Issues** tab — the run's `SOURCE_REPORT` record says which road was used and why the run stopped.
- 🧰 **More clean data actors:** [Fox Labs on Apify](https://apify.com/foxlabs)

### Changelog

#### 0.1 — 2026-10-09

- First version: one row per post or reel from a list of addresses; `playCount` from the owner's Reels tab (`includeReelPlays`), `videoViewCount` from the embed page beside it; `ownerFollowers` + `engagementRate` (photos too); free status rows for undeliverable lines; start-up check ends a run before anything is read if Instagram changed its query. Standby mode (`GET /post?url=…`) prepared; published in batch mode.

# Changelog

This Actor's version history is a separate document: https://apify.com/foxlabs/instagram-post-details-scraper/changelog.md

# Actor input Schema

## `postUrls` (type: `array`):

One post or reel per line: its address in any form Instagram writes it (https://www.instagram.com/p/…/, /reel/…/, /reels/…/, /tv/…/, with or without a user name in front or a query string), its short code (DeNRLCCF4kk) or its numeric post id. Two lines that name the same post are delivered once. A share link (instagram.com/share/…) is not a post address: open it and copy the address it leads to.

## `includeVideoStats` (type: `boolean`):

On: for every video, reel and carousel the post's embed page is read as well — one more request per post. It adds the embed page's view count of a video (videoViewCount), the owner's exact follower count (ownerFollowers) and the engagement rate worked out from it. A single photo's embed page shows the follower count only shortened, so for photos the count is read from the owner's profile instead: one small request per different owner, however many of the owner's posts are in the list. Off: likes, comments, time, caption and everything else still come; the three fields stay empty.

## `includeReelPlays` (type: `boolean`):

On: for a reel, the play figure of the reel's tile on its owner's Reels tab (playCount). It is found only when the reel is among the owner's 36 newest or pinned reels: the tab is read from its top, at most three pages (its first 36 tiles) per different owner in a run; a reel further down gets no play count. This is not the embed page's view count (videoViewCount): the two are different counters, and the play figure was the larger one on every reel measured. Off: no request to the Reels tab; playCount stays empty.

## `maxPosts` (type: `integer`):

The run stops when this many rows have been delivered. You are charged only for delivered rows; lines that cannot be delivered are reported in free status rows.

## `proxyConfiguration` (type: `object`):

Nothing to change for normal use: requests leave from the run's own address, and the Actor moves to Apify Proxy by itself if Instagram turns that address away. Turn a proxy on here to send every request through it: the run then stays on that proxy, and a setting the platform refuses ends the run with a message before anything is read.

## Actor input object example

```json
{
  "postUrls": [
    "https://www.instagram.com/p/DeNRLCCF4kk/",
    "https://www.instagram.com/p/DeP15SzjF9r/",
    "https://www.instagram.com/reel/DdB9sMlAsb8/",
    "https://www.instagram.com/reel/DeCPVhERA8e/"
  ],
  "includeVideoStats": true,
  "includeReelPlays": true,
  "maxPosts": 100000,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

# 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 = {
    "postUrls": [
        "https://www.instagram.com/p/DeNRLCCF4kk/",
        "https://www.instagram.com/p/DeP15SzjF9r/",
        "https://www.instagram.com/reel/DdB9sMlAsb8/",
        "https://www.instagram.com/reel/DeCPVhERA8e/"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("foxlabs/instagram-post-details-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 = {
    "postUrls": [
        "https://www.instagram.com/p/DeNRLCCF4kk/",
        "https://www.instagram.com/p/DeP15SzjF9r/",
        "https://www.instagram.com/reel/DdB9sMlAsb8/",
        "https://www.instagram.com/reel/DeCPVhERA8e/",
    ],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("foxlabs/instagram-post-details-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 '{
  "postUrls": [
    "https://www.instagram.com/p/DeNRLCCF4kk/",
    "https://www.instagram.com/p/DeP15SzjF9r/",
    "https://www.instagram.com/reel/DdB9sMlAsb8/",
    "https://www.instagram.com/reel/DeCPVhERA8e/"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call foxlabs/instagram-post-details-scraper --silent --output-dataset

```

## MCP server setup

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