# Instagram Posts Scraper API - Posts, Reels, Exact Counts (`vonsensey/instagram-posts-scraper-api`) Actor

Used by social analysts, agencies and creator-tracking pipelines monitoring accounts at scale. Instagram posts scraper for posts, reels and carousels from any public profile: exact like, comment and play counts, captions, every media URL. No login, no cookies. Change-only re-runs; failures free.

- **URL**: https://apify.com/vonsensey/instagram-posts-scraper-api.md
- **Developed by:** [Blackcube](https://apify.com/vonsensey) (community)
- **Categories:** Social media, Marketing, Automation
- **Features:** Limited permissions
- **Stats:** 7 total users, 4 monthly users, 74.4% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 post (image or carousel)s

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 Posts Scraper API - Posts, Reels, Exact Counts

<table style="border-collapse:collapse;width:100%;margin:0 0 4px">
<tr><td colspan="3" style="padding:9px 12px;background:#0B6E75;border:1px solid #0B6E75"><span style="color:#FFFFFF;font-weight:700;font-size:13px;letter-spacing:.3px">Instagram Suite</span><span style="color:#CFF0F2;font-size:12px"> &nbsp;&bull;&nbsp; 4 Actors, one codebase, one row billed once</span></td></tr>
<tr><td style="padding:9px 12px;border:1px solid #E5E7EB;background:#ECFDF5;vertical-align:top;width:33%"><span style="color:#0B6E75;font-weight:700;font-size:13px">Instagram Posts Scraper API</span><br><span style="color:#0B6E75;font-size:11px;font-weight:600">&#10148; You are here</span></td><td style="padding:9px 12px;border:1px solid #E5E7EB;background:#FFFFFF;vertical-align:top;width:33%"><a href="https://apify.com/vonsensey/instagram-reels-scraper-api" style="color:#111827;font-weight:700;font-size:13px;text-decoration:none">Instagram Reels Scraper API</a><br><span style="color:#6B7280;font-size:11px">Play Counts, MP4 URLs</span></td><td style="padding:9px 12px;border:1px solid #E5E7EB;background:#FFFFFF;vertical-align:top;width:33%"><a href="https://apify.com/vonsensey/instagram-profile-posts-scraper-api" style="color:#111827;font-weight:700;font-size:13px;text-decoration:none">Instagram Profile Posts Scraper API</a><br><span style="color:#6B7280;font-size:11px">Newest Posts by Username</span></td></tr>
<tr><td style="padding:9px 12px;border:1px solid #E5E7EB;background:#FFFFFF;vertical-align:top;width:33%"><a href="https://apify.com/vonsensey/instagram-new-posts-monitor-api" style="color:#111827;font-weight:700;font-size:13px;text-decoration:none">Instagram New Posts Monitor API</a><br><span style="color:#6B7280;font-size:11px">Schedule It, Pay for Changes</span></td></tr>
</table>

**More from this account:** [YouTube Transcript Suite](https://apify.com/vonsensey/youtube-transcript-scraper) · [Website Contact & Email Suite](https://apify.com/vonsensey/website-contact-email-extractor) · [Career Site & ATS Jobs Suite](https://apify.com/vonsensey/career-page-job-postings-scraper-api) · [Google News Suite](https://apify.com/vonsensey/google-news-scraper-api) · [Keyword Research Suite](https://apify.com/vonsensey/google-keyword-ideas-scraper) · [Shopify Store Intelligence Suite](https://apify.com/vonsensey/shopify-store-leads-scraper) · [eBay Data Suite](https://apify.com/vonsensey/ebay-scraper-api) · [Amazon Reviews Suite](https://apify.com/vonsensey/amazon-reviews-scraper-api) · [Reddit](https://apify.com/vonsensey/reddit-scraper-posts-comments-api) · [Meta Ad Library](https://apify.com/vonsensey/facebook-ads-library-scraper-meta-ad-api) · [Vinted](https://apify.com/vonsensey/vinted-scraper-api) · [Trustpilot Review Intelligence Suite](https://apify.com/vonsensey/trustpilot-reviews-scraper) · [App Store & Google Play Reviews Suite](https://apify.com/vonsensey/app-store-google-play-reviews-scraper) · [Etsy Research Suite](https://apify.com/vonsensey/etsy-scraper) · [YouTube Comments Intelligence Suite](https://apify.com/vonsensey/youtube-comments-scraper) · [Telegram Channel Intelligence Suite](https://apify.com/vonsensey/telegram-channel-scraper-api) · [Business Reviews Suite](https://apify.com/vonsensey/business-reviews-aggregator-scraper-api) · [Google Trends Suite](https://apify.com/vonsensey/google-trends-scraper) · [Amazon Product Data Suite](https://apify.com/vonsensey/amazon-product-scraper-api) · [Polymarket Order Book](https://apify.com/vonsensey/polymarket-orderbook-clob-prices-scraper-api) · [Nordic Marketplaces Suite](https://apify.com/vonsensey/blocket-finn-nordic-marketplace-scraper-api) · [Google Sheets Suite](https://apify.com/vonsensey/google-sheets-scraper-api) · [TikTok Suite](https://apify.com/vonsensey/tiktok-scraper-api) · [Snapchat Suite](https://apify.com/vonsensey/snapchat-scraper-api) · [LinkedIn Public Data Suite](https://apify.com/vonsensey/linkedin-scraper-api) · [Contact Validation Suite](https://apify.com/vonsensey/email-verifier-validator-api) · [Google Maps Suite](https://apify.com/vonsensey/google-maps-reviews-scraper-api) · [X / Twitter](https://apify.com/vonsensey/tweet-scraper) · [Software Reviews](https://apify.com/vonsensey/software-reviews-scraper)

#### The Instagram suite

- [Instagram Reels Scraper API](https://apify.com/vonsensey/instagram-reels-scraper-api) — only the reels from a profile, with play counts and the video file
- [Instagram Profile Posts Scraper API](https://apify.com/vonsensey/instagram-profile-posts-scraper-api) — a username in, its newest 12 posts out
- [Instagram New Posts Monitor API](https://apify.com/vonsensey/instagram-new-posts-monitor-api) — put profiles on a schedule and pay only for posts you have not received yet

Instagram posts, reels and carousels from any public profile in one typed dataset: exact like, comment and play counts, full captions with hashtags and mentions, every image and MP4 URL with dimensions, location and co-authors. No login, no cookies, no proxy to configure — it reads the public feed Instagram shows to anyone. **Failures are free**: a profile that is private, missing or empty costs nothing and returns a row saying which.

**Exact numbers, not display numbers.** Instagram's page says "1.4M likes" and "46M plays"; the rows carry 1,487,695 and 46,522,596.

### Quick start

1. Press **Start** — the defaults are a working run.
2. Replace them with your own usernames or profile URLs (`nasa`, `@nasa` and `https://www.instagram.com/nasa/` all work), one per line.
3. Take the dataset as JSON, CSV or Excel, or via the API. Every row has a `type`; the free `coverage` row says what was asked for and what arrived.

### What people use it for

- **Content and competitor analysis.** What a brand, creator or rival account posts, how often, and how each post performs — exact counts, not rounded.
- **Influencer vetting.** Engagement per post over the newest posts, paid-partnership flags, co-authored posts, verified status.
- **Archiving and datasets.** Captions, hashtags, mentions, dates, locations and media URLs for a list of profiles, each profile's newest 12, newest first.
- **Feeding an AI agent or workflow.** One flat schema, a `type` on every row, and a free coverage row that says what was asked for and what arrived.

### What the rows look like

#### A post row

```json
{
  "type": "post",
  "profile": "nasa",
  "id": "3967213292204992434",
  "shortcode": "DcOX3hWFiey",
  "url": "https://www.instagram.com/p/DcOX3hWFiey/",
  "mediaType": "image",
  "takenAt": "2026-08-19T14:11:47.000Z",
  "caption": "With your powers combined… This colorful picture of the cosmos is the product of teamwork between our @NASAHubble ...",
  "hashtags": [],
  "mentions": ["NASAHubble", "NASAWebb"],
  "likeCount": 503772,
  "commentCount": 3547,
  "playCount": null,
  "media": [{ "kind": "image", "url": "https://instagram.f...fbcdn.net/v/t51.82787-15/...jpg", "width": 1440, "height": 1440, "id": null }],
  "carouselCount": null,
  "location": null,
  "coauthors": [],
  "isPaidPartnership": false,
  "isPinned": true,
  "owner": { "id": "528817151", "username": "nasa", "fullName": "NASA", "isVerified": true, "isPrivate": false }
}
```

`likeCount` is null, never 0, when the author hides like counts. `profile` is the username whose feed the row came from; `owner` is the original poster, which differs on a collaboration post. A carousel carries every slide in `media` in order, with `carouselCount`.

#### A reel row

```json
{
  "type": "reel",
  "profile": "cristiano",
  "shortcode": "Dcgs4DvIr3u",
  "url": "https://www.instagram.com/reel/Dcgs4DvIr3u/",
  "mediaType": "video",
  "productType": "clips",
  "likeCount": 1487695,
  "commentCount": 18722,
  "playCount": 46522596,
  "videoDurationSec": 21.68,
  "hasAudio": true,
  "media": [{ "kind": "video", "url": "https://instagram.f...fbcdn.net/o1/v/t2/f2/m86/....mp4", "width": 720, "height": 1280, "id": null }],
  "music": { "title": "Original audio", "artist": "cristiano", "isOriginal": true }
}
```

`playCount` is Instagram's exact play count for the reel. Media URLs are signed by Instagram and expire after a few hours — download during the run, or turn them off.

### What it costs

| You pay for | Price |
|---|---|
| Each image or carousel post delivered | **$1.50 per 1,000 posts** |
| Each reel or video post delivered (play count, duration, sound and the MP4 URL included) | **$2.00 per 1,000 reels** |
| Each profile feed read (only when at least one post from it was delivered; never counted against your result cap) | **$2.00 per 1,000 profiles** |
| Optional monthly pass: 30 days with no per-row charges, charged once, no automatic renewal | **$9.90** |

**Free, always:** a profile that does not exist, is private or has no posts, a post skipped by your content or date filter, a post you already received on a monitoring run (with New posts only off, only one that did not change), a malformed input, every error row, the coverage row and the run summary. A run that reads nothing costs nothing.

**The monthly pass** is for heavy use: turn it on and the run charges it once, right before the first post, reel or feed check would be billed, then every run you start with it on for the next 30 days delivers posts, reels and feed checks without per-row charges. A pass covers about 1,000 one-page runs in its 30 days at $9.90 and about 2,000 at $19.80, fewer with pages read through residential exits; past that, rows bill at the normal price and one free row says so. It pays for itself above roughly 6,600 posts or 4,950 profile checks a month. It is never charged silently — only when you run with it on and no pass is active.

Set **Cost ceiling (USD)** to stop any run before it passes a number you choose; the free summary row reports what the run actually spent.

### Limits, stated plainly

Instagram shows follower and following counts, the bio, stories, highlights, the comments under a post, hashtag and location pages, and search only to signed-in accounts (measured 2026-09-02 from two independent networks). This Actor reads public feeds only and never signs in, so it sells none of those — and says so here rather than on your invoice.

Media URLs are signed by Instagram and expire after a few hours. A private account's posts are not readable at all; the row says `private`.

Like counts an author has hidden come back as null, never as zero.

### Use it from n8n, MCP, the API or a schedule

Built to be called by a workflow, not only from the Store form. The Actor is `vonsensey/instagram-posts-scraper-api`; every snippet below sends `{}`, which runs the defaults shown on the form — replace it with your own input.

#### n8n

Install the **Apify** community node (`@apify/n8n-nodes-apify` under *Settings → Community Nodes*, or search "Apify" on n8n Cloud). Add **Apify → Run Actor** with Actor `vonsensey/instagram-posts-scraper-api` and your input JSON, then **Apify → Get Dataset Items** on the run's `defaultDatasetId` and pipe the rows anywhere. For scheduled runs, the **On new Apify Event** trigger fires when a run of this Actor finishes.

#### MCP (Claude, Cursor, VS Code, any MCP client)

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=vonsensey/instagram-posts-scraper-api",
      "headers": {
        "Authorization": "Bearer <YOUR_APIFY_TOKEN>"
      }
    }
  }
}
```

Your agent then calls `vonsensey/instagram-posts-scraper-api` as a tool with the same input the form takes and reads the dataset back.

#### REST API (one call, rows in the response)

```bash
curl -X POST "https://api.apify.com/v2/acts/vonsensey~instagram-posts-scraper-api/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" -d '{}'
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("vonsensey/instagram-posts-scraper-api").call(run_input={})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row)
```

#### JavaScript

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('vonsensey/instagram-posts-scraper-api').call({});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

#### Make, Zapier, LangChain, CrewAI

The Apify app in **Make** and **Zapier** has a *Run an Actor* module: pick `vonsensey/instagram-posts-scraper-api`. In **LangChain** and **CrewAI** the Apify tool wrappers take the same Actor id. A daily **schedule** needs nothing but the Console: *Schedules → Create → this Actor → cron*, and the dataset fills on its own.

> **Run it without configuring anything** — [Export a brand's Instagram posts with exact like counts](https://apify.com/vonsensey/instagram-posts-scraper-api/examples/brand-instagram-posts-with-exact-likes), a ready-made example you can start as-is or copy.

### Use cases

- **Track what a profile actually publishes.** Every post, reel and carousel from a public profile feed with exact like and comment counts, the full caption with hashtags and mentions parsed out, the posted date, location, co-authors and the paid-partnership flag.
- **Build a reels dataset.** Only the video posts, each with its exact play count, duration, whether it has audio, the sound's title and artist, and the direct MP4 URL with its dimensions.
- **Watch profiles on a schedule.** Turn Monitor on and, with New posts only on (the default), a post you have already received is not billed again; each profile Instagram answered is billed as one feed check, so a quiet day costs one check per profile and nothing else.
- **Feed an agent or an LLM.** One flat schema for posts and reels, captions already split into hashtags and mentions, and a free error row naming any profile that was private, missing or empty.

### Run it on a schedule

A one-off pull answers a question; a schedule answers it every day without you. Open **Schedules** in the Apify Console, point a cron at this Actor, and the dataset keeps filling on its own — no server, no cron box, no babysitting. Everything here is built to be re-run: you are billed per row delivered, and the FAQ below says exactly what a scheduled run that finds nothing new costs.

### FAQ

#### Do I need an Instagram login, cookies or a proxy?

No. Every listing in this suite reads the public feed Instagram serves to anyone, and it never signs in, never sends a cookie and never uses a session. Everything is handled for you and there is nothing to buy on top.

#### Can I get follower counts, the bio, stories, comments or hashtag pages?

Not from this suite, and it says so rather than pretending. Instagram shows those only to signed-in accounts — measured 2026-09-02 from two independent networks. What you get is the feed itself; every row still carries the poster's username, full name, verified and private flags.

#### What is the difference between a post row and a reel row?

A post is an image or a carousel; a reel is a video. A reel row carries everything a post row does plus the exact play count, duration, audio flag, sound title and artist and the MP4 URL, which is why it is priced a little above a post. Use **What to deliver** to take only one kind — skipped items are never billed.

#### How far back can I go?

As far as the profile's public feed goes, 12 posts per page. Set a depth with **Newest posts per profile**, or stop at a date with **Only posts from the last N days**. Pinned posts sit first regardless of date and do not end the walk.

#### What does a private, missing or empty profile cost?

Nothing. You get a free error row saying which — `private`, `not-found` or `no-posts` — and the run keeps going. "All of these are private or deleted" is a correct answer, not a failure, so the run still succeeds.

#### Will a schedule bill me twice for the same post?

No. Delivered posts are remembered per profile. With **New posts only** on (the default), a post you already received is not read or billed again, even when its counts, caption or pin change. Turn it off to get such a post again, billed and marked `updated`; a post that did not change then comes back as a free row marked `unchanged`. What a scheduled run does cost is one **profile feed read** for each profile Instagram answered — a profile that does not exist, is private or refused us is never charged.

#### Why is a like count `null` instead of `0`?

Because the author hid it. A hidden count is returned as null, never as zero, so a hidden count and a genuine zero are never confused.

#### Do the image and video URLs keep working?

Not indefinitely — Instagram signs them and they expire after a few hours. Download what you need in the same pipeline run rather than storing the URL.

***

Something wrong, or a field you need that is missing? Open an issue on the **Issues** tab — it is read and it gets fixed. If this saved you time, a rating on the Store page helps the next person find it.

# Actor input Schema

## `usernames` (type: `array`):

Usernames or profile URLs — 'nasa', '@nasa' and 'https://www.instagram.com/nasa/' all work, one per line. Each profile's public feed is read newest first: posts, reels and carousels with exact like, comment and play counts. A profile that does not exist, is private or has no posts returns a free row saying which, never a charge.

## `contentType` (type: `string`):

Everything in the feed, only image and carousel posts, or only reels and videos. Skipped items are never billed.

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

How many of each profile's newest posts to deliver, up to 12: Instagram shows a visitor who is not signed in only a profile's newest 12 posts (or 12 reels), and this Actor never signs in. Asking for more is fine; the coverage row says when a profile had more.

## `sinceDays` (type: `integer`):

Stop reading a profile once its posts are older than this many days. Combine with a schedule and Monitor to receive only what is new. Leave empty for no date limit.

## `since` (type: `string`):

An ISO date such as 2026-08-01. Ignored when 'last N days' is set.

## `maxItems` (type: `integer`):

Hard cap on billable rows for this run, across all profiles. Feed checks never count against it.

## `includeMediaUrls` (type: `boolean`):

Direct CDN URLs for every image, carousel child and reel MP4, with dimensions. They are signed by Instagram and expire after a few hours, so download what you need from the run rather than storing the links.

## `monitorChangesOnly` (type: `boolean`):

For scheduled runs. The Actor remembers every post it has delivered, per profile. 'New posts only' below decides what happens to a post you already received. Each profile read is billed as one feed check.

## `newPostsOnly` (type: `boolean`):

Works with Monitor on. On: a post you already received is not read, delivered or billed again, even when its counts, caption or pin change; only new posts are delivered and billed. Off: a post whose counts, caption or pin changed is delivered and billed again, marked 'updated', and one that did not change comes back as a free row marked 'unchanged'.

## `monthlyPass` (type: `boolean`):

Charge one monthly pass instead of paying per post. Charged once, right before the first post, reel or feed check would be billed (a private or empty profile buys none), and only again after 30 days if you run with this on; a run whose spending limit cannot cover it bills per unit instead. While it is active, every run you start with this on delivers rows and feed checks without per-row charges, up to the pass's monthly volume: about 100 runs of one feed page for each dollar the pass costs, fewer with more pages a run or through residential exits. Past it, rows and feed checks bill at the normal price and one free row says so. Worth it once a month of per-post, per-reel and feed-check charges would pass the price of the pass.

## `maxCostUsd` (type: `number`):

Stop the run before it spends more than this. Leave empty for no ceiling. The free summary row always reports what the run actually spent.

## `useProxy` (type: `boolean`):

Not normally needed — everything is handled for you and the Actor escalates automatically if Instagram refuses a request. Turn it on only if you have been asked to.

## Actor input object example

```json
{
  "usernames": [
    "nasa",
    "natgeo"
  ],
  "contentType": "all",
  "maxPostsPerProfile": 12,
  "maxItems": 100,
  "includeMediaUrls": true,
  "monitorChangesOnly": false,
  "newPostsOnly": true,
  "monthlyPass": false,
  "useProxy": 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 = {
    "usernames": [
        "nasa",
        "natgeo"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("vonsensey/instagram-posts-scraper-api").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 = { "usernames": [
        "nasa",
        "natgeo",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("vonsensey/instagram-posts-scraper-api").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 '{
  "usernames": [
    "nasa",
    "natgeo"
  ]
}' |
apify call vonsensey/instagram-posts-scraper-api --silent --output-dataset

```

## MCP server setup

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

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/kRz9fVKvRoYfvTBea/builds/7YZEk1TfBTQb2LZvr/openapi.json
