# Instagram Post Scraper & API: Likes, Comments & Post Date (`s_actors/instagram-post-scraper`) Actor

Scrape any Instagram post, Reel or carousel by link, or the latest posts of a profile: exact posting date and time, likes, comments, Reel plays, caption, hashtags, image and MP4 links, carousel items, audio, location, tagged accounts, top comments, followers. No login.

- **URL**: https://apify.com/s_actors/instagram-post-scraper.md
- **Developed by:** [Superior Actors](https://apify.com/s_actors) (community)
- **Categories:** Social media, Marketing, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.99 / 1,000 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

### Instagram Post Scraper

Scrape **any public Instagram post, Reel or carousel by its link**, or the latest posts of a profile. You get the **exact date and time it was posted**, likes, comments, **Reel plays**, the caption with its hashtags and mentions, image and **MP4 links**, every carousel item, the audio, location, collaborators, tagged accounts, the **top comments** and the author's **follower count and engagement rate**.

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

No Instagram login, no cookies, no browser. Paste links, shortcodes or media IDs and get one row per post. Use it as an **Instagram post scraper API** for campaign reports, influencer vetting, UGC and brand monitoring, or as an **Instagram post date and time finder**: Instagram's app shows only "3 days ago", while this Actor gives the exact UTC time to the second.

#### What you get

Real example, 18 October 2026:

| author | type | posted (UTC) | likes | comments | Reel plays | engagement, % | carousel items |
|---|---|---|---|---|---|---|---|
| natgeo | photo | 2026-10-17 20:00:01 | 76,865 | 161 | | 0.029 | |
| natgeo | reel | 2026-10-17 13:11:03 | 209,039 | 3,384 | 10,867,982 | 0.079 | |
| natgeo | carousel | 2026-10-16 19:35:02 | 26,816 | 74 | | 0.010 | 7 |
| nasa | carousel | 2026-10-13 19:41:17 | 1,965,511 | 6,061 | | 1.889 | 3 |
| kyliejenner | reel | 2026-10-16 18:21:42 | 719,241 | 4,274 | 19,123,320 | 0.190 | |
| kyliejenner | carousel | 2026-09-14 15:26:49 | 3,188,274 | 8,409 | | 0.840 | 9 |

Every row:

| Field | Example | What it is |
|---|---|---|
| `postUrl`, `shortcode`, `postId`, `type` | instagram.com/reel/DemLxMGgoL\_/, reel | the post; type is photo, carousel or reel |
| `postedAt`, `postedAtUnix` | 2026-10-17T13:11:03Z, 1792242663 | exact posting time (UTC), as Instagram stores it |
| `likes`, `comments` | 209,039, 3,384 | exact counts (`likes` is empty and `likesHidden` true when the author hides them) |
| `plays` | 10,867,982 | Reel plays, the number the app shows as views |
| `engagementRate`, `ownerFollowers` | 0.079, 268,353,768 | (likes + comments) / followers × 100, and the author's followers |
| `caption`, `hashtags`, `mentions`, `captionEdited` | "The giant anteater…", \[], \["fernando.faciole"] | caption text, its hashtags and @mentions, whether it was edited |
| `imageUrl`, `videoUrl`, `width`, `height` | scontent…cdninstagram.com/….jpg / .mp4 | the image (largest size) and the MP4 file; Instagram links expire after a few days |
| `carouselCount`, `carouselItems` | 7, \[{type: "video", imageUrl, videoUrl}] | each photo and video of a carousel |
| `audio` | {title: "Original audio", artist: "natgeo", isOriginal: true} | the song or original sound of a Reel, with its ID |
| `coauthors`, `taggedUsers`, `locationName` | \["projectceti"], \["20thcenturystudios"] | collaborators, tagged accounts, location |
| `topComments` | \[{username, text, likes, createdAt}, …] | up to 15 comments Instagram shows first |
| `topics`, `altText` | \["whale communication", …], "Video by National Geographic…" | Instagram's related topics and the image description |
| `ownerUsername`, `ownerId`, `ownerFullName`, `ownerVerified` | natgeo, 787132, National Geographic, true | the author |
| `profile`, `isPinned` | nasa, false | for profiles: the profile you asked for and whether the post is pinned |

The **Posts** view of the dataset shows the main table; **Media, tags, comments** shows the rest. Export to Excel, CSV, JSON or Google Sheets.

#### How to use it

1. Add **post or Reel links**: `https://www.instagram.com/p/DelZ5g8l8Pr/`, `/reel/…`, `/tv/…`, a shortcode `DelZ5g8l8Pr` or a numeric media ID, one per line (up to 5,000 a run).
2. Or add **profiles**: `natgeo`, `@natgeo`, a profile link or the user ID. You get the latest posts of each (up to 12, photos, carousels and Reels), with optional **Posted after** and **Skip pinned posts** filters.
3. Run, then open the dataset or call it from the API.

Reel plays are on by default: Instagram shows them only on the author's Reels tab, so the Actor reads that tab back to the Reel's date (10 pages = the author's latest 120 Reels by default; set **Reels tab pages per author** higher for older Reels, or turn plays off for speed).

#### Why this Actor

| | This Actor | Typical post scrapers |
|---|---|---|
| Login, cookies | none | some need your session |
| Posting time | exact, to the second, for photos too | often only a date, or none for photos |
| Reel plays | yes, exact | often missing or a separate add-on |
| Followers, engagement | in every row | a separate run |
| Carousel items, MP4, audio | included | paid add-ons |
| Top comments | up to 15 in every row | a separate comments scraper |
| Monitoring | only-new mode for profiles | no |
| Price | $1.49 per 1,000 posts | $1.50-5.00 per 1,000, often + start fees |

#### Monitor profiles for new posts

Save your input as a task, schedule it every hour or day and turn on **Only new posts since the previous run**: each run returns only the posts published since the last one (the first run returns everything and remembers it). Send new rows to Google Sheets, Slack, email or a webhook with an Apify integration.

#### Pricing

Pay per result, no subscription:

| Event | Price | When |
|---|---|---|
| Post | $1.49 per 1,000 ($1.29 on Scale, $0.99 on Business) | each post in the results; missing posts and filtered posts are free |
| New profile lookup | $0.004 | rare: a profile with embedding turned off that nobody looked up in the last 3 days, when Instagram shows its page only to a residential IP |
| Run start | $0.001 | |

Examples: 100 post links = **$0.15**; the latest 12 posts of 10 competitors = **$0.18**; a daily only-new check of 20 profiles posting once a day ≈ $0.92 a month.

#### FAQ

**Do I need an Instagram account?** No. The Actor reads public posts the way a logged-out visitor sees them.

**How exact is the posting time?** It is the timestamp Instagram stores for the post, in UTC, to the second (convert it to your time zone in Excel or Sheets). For scheduled posts it is the time the post went live.

**Why are there only 12 posts per profile?** Instagram shows a profile's 12 latest posts to visitors without a login. For **all Reels** of a profile use Instagram Reels Scraper.

**Why are some Reels without plays?** The play count comes from the author's Reels tab. A Reel older than the pages read (120 Reels back by default) or a video posted outside the Reels tab gets no plays; raise **Reels tab pages per author** for older Reels.

**Private accounts and deleted posts?** Not available: the run log lists them and they are free.

**Can I download the photos and videos?** Each row has `imageUrl` / `videoUrl` and every carousel item's links. Instagram's links expire after a few days, so download them soon after the run.

**All comments of a post?** The row has up to 15 comments Instagram shows first; the full list needs a login.

#### Use with the API and AI agents

Run it from your code or an AI agent with the Apify API, the Apify MCP server or the Python and JavaScript clients; read the results from the dataset (`?view=posts` for the main table).

#### Other social media tools

| Tool | What it does |
|---|---|
| [TikTok Profile Scraper](https://apify.com/s_actors/tiktok-profile-scraper) | All videos of TikTok creators with exact stats and MP4 links |

# Actor input Schema

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

Links to public posts, Reels or carousels (https://www.instagram.com/p/…, /reel/…, /tv/…), shortcodes (DelZ5g8l8Pr) or numeric media IDs, one per line. Up to 5,000 per run.

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

Usernames (natgeo or @natgeo), profile links or numeric user IDs: the latest posts of each (photos, carousels and Reels). Instagram shows 12 posts of a profile without a login. For every Reel of a profile use Instagram Reels Scraper.

## `postsPerProfile` (type: `integer`):

The newest N posts of each profile, up to 12 (pinned posts are marked).

## `postedAfter` (type: `string`):

Only posts published after this date (2026-10-01) or within this period (24 hours, 7 days, 2 weeks).

## `skipPinned` (type: `boolean`):

Leave out the posts pinned to the top of the profile (they are often old).

## `onlyNew` (type: `boolean`):

Return only posts not returned by your earlier runs with the same monitor name. Schedule the Actor (every hour or day) to get each new post of the profiles once.

## `monitorName` (type: `string`):

Separate memory for separate schedules (for example 'competitors' and 'clients'). Empty = default.

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

Add the play count of each Reel. Instagram shows it only in the author's Reels tab, so the Actor reads that tab back to the Reel's date.

## `maxReelsTabPages` (type: `integer`):

How far back the plays are looked up: 12 Reels a page, so 10 pages cover the author's latest 120 Reels. An older Reel gets no play count.

## `maxConcurrency` (type: `integer`):

How many posts are read in parallel.

## `debugLog` (type: `boolean`):

Log every retried request.

## Actor input object example

```json
{
  "postUrls": [
    "https://www.instagram.com/p/DelZ5g8l8Pr/",
    "https://www.instagram.com/reel/Deo3af3k8JJ/",
    "https://www.instagram.com/p/DekS-u4GltE/"
  ],
  "postsPerProfile": 12,
  "skipPinned": false,
  "onlyNew": false,
  "includeReelPlays": true,
  "maxReelsTabPages": 10,
  "maxConcurrency": 5,
  "debugLog": false
}
```

# Actor output Schema

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

One row per post with its exact date, likes, comments, plays and engagement.

## `details` (type: `string`):

Image and MP4 links, carousel items, audio, tags, location and top comments.

## `all` (type: `string`):

Every field of every row.

# 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/DelZ5g8l8Pr/",
        "https://www.instagram.com/reel/Deo3af3k8JJ/",
        "https://www.instagram.com/p/DekS-u4GltE/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("s_actors/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 = { "postUrls": [
        "https://www.instagram.com/p/DelZ5g8l8Pr/",
        "https://www.instagram.com/reel/Deo3af3k8JJ/",
        "https://www.instagram.com/p/DekS-u4GltE/",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("s_actors/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 '{
  "postUrls": [
    "https://www.instagram.com/p/DelZ5g8l8Pr/",
    "https://www.instagram.com/reel/Deo3af3k8JJ/",
    "https://www.instagram.com/p/DekS-u4GltE/"
  ]
}' |
apify call s_actors/instagram-post-scraper --silent --output-dataset

```

## MCP server setup

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