# Instagram Posts Scraper: Comments & Carousels, $1.2/1K (`transparent_meteorite/instagram-posts-scraper`) Actor

Scrape Instagram posts from any public account without login: photos, carousels and reels with likes, comments, plays, caption, hashtags, mentions, alt text, all carousel images, tagged users, location, music and the latest comments. Post URLs work too.

- **URL**: https://apify.com/transparent_meteorite/instagram-posts-scraper.md
- **Developed by:** [Detroit Web Agent - Open Data](https://apify.com/transparent_meteorite) (community)
- **Categories:** Social media, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 1,000 post rows

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: likes, comments, carousels and captions, no login

![Instagram Posts Scraper: features, price and a real output row](https://api.apify.com/v2/key-value-stores/9BAn0msnxToXlD9TO/records/sf-instagram-posts-scraper-banner-10141232.png)

[![Run it free on Apify](https://api.apify.com/v2/key-value-stores/9BAn0msnxToXlD9TO/records/sf-cta.png)](https://console.apify.com/actors/DAjzuC6weeAW3zF67/input)

| Price per 1,000 posts | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| **This Actor** | **$1.20** | **$1.10** | **$1.00** | **$0.40** |
| Most-used alternative | $2.70 | $2.30 | $2.00 | $1.60 |

<sub>Pay per event, no monthly rental. Prices read from each Actor's public Apify pricing on 2026-10-13; check the Pricing tab for the current figure.</sub>

![Instagram Posts Scraper sample output table from a real run](https://api.apify.com/v2/key-value-stores/9BAn0msnxToXlD9TO/records/sf-instagram-posts-scraper-output-10141232.png)

Scrape the posts of any public Instagram account without logging in: photos, carousels and reels, newest first. Each row is one post with its caption, hashtags, mentions, likes, comments count, **the latest comments**, date, type, cover image, **every carousel image with its own alt text**, video URL, **play count** and duration for videos, music or original audio, tagged users, collab co-authors, paid-partnership brands, location and the pinned flag. Paste usernames, profile URLs or single post URLs.

- No Instagram account, cookies or session. Nothing is logged in, so your own account is never at risk.
- Full details are **included in the price**: comments, carousel children, alt text, tagged users and music. No separate "details" charge.
- From **$1.20 per 1,000 posts** on the free plan, down to **$0.40 per 1,000** on paid plans.
- Accounts that do not exist, private accounts, failed pages and posts you filter out are never charged.
- 20 posts with full details usually arrive in under half a minute.

### Run in 30 seconds

1. Open the actor in [Apify Console](https://console.apify.com/actors?search=transparent_meteorite%2Finstagram-posts-scraper) (a free Apify account is enough).
2. Press **Start** with the prefilled input: the 20 newest posts of @natgeo, about $0.03 on the free plan.
3. Open the **Output** tab. The **Posts** view is a table with the image, type, caption, likes, comments, plays, date and link. Download CSV, Excel or JSON.

```json
{
  "username": ["natgeo"],
  "resultsLimit": 20
}
```

An empty input (`{}`) also works and runs the same example, so you can see the output before you type anything.

### Why this posts scraper

- **One price with everything in it.** Comments, carousel children, alt text, tagged users and music come with every post. You do not pay a second fee per post for details.
- **Latest comments on every post:** text, author handle, author picture, verified badge, comment likes, reply count and date.
- **Carousels in full.** `childPosts` lists every slide with its own image or video URL, alt text, size and tagged users; `images` gives all slide images in one list.
- **Play counts for videos and reels**, read from Instagram's reels feed and merged into the post rows, plus `videoViewCount`, duration and an audio-only URL.
- **All post types in order:** photos, carousels and reels, exactly as they appear on the grid, with `productType` telling them apart and pinned posts flagged.
- **Collabs, tags and partnerships** in their own columns, so you can map brand deals and creator networks.
- **Date filter that saves money.** `onlyPostsNewerThan` stops paging at your date, so old posts are neither read nor charged.
- **Almost nothing per run.** Beyond the price per post, a run costs only Apify's standard $0.00005 start event, which matters when you run many small scheduled jobs.

### What it does and who it is for

The actor reads what Instagram serves to any logged-out visitor: the account's public post grid, the public reels tab for play counts, and each post's public page for comments and carousel details. It combines them into one clean row per post.

- **Social media managers and agencies:** report on competitors' and clients' posts with likes, comments and plays in one sheet.
- **Influencer marketing:** check engagement on a creator's recent posts and see their paid partnerships and collaborators.
- **Brand monitoring:** track what a brand posts, when, with which hashtags and which tagged accounts.
- **E-commerce and product teams:** collect product photos and captions from public brand accounts you are allowed to analyse.
- **Researchers and journalists:** archive public posts with captions, timestamps, locations and the public comment snapshot.
- **AI and data teams:** build datasets of captions, alt text and engagement for analysis.

### What you get: output fields

Every row is one post.

| Field | What it is |
|---|---|
| `shortCode`, `url`, `id` | Post shortcode, link and media ID |
| `type` | `Image`, `Video` or `Sidecar` (carousel) |
| `productType` | `feed`, `carousel_container` or `clips` (reel) |
| `caption` | Full caption text |
| `hashtags`, `mentions` | Hashtags and @mentions from the caption, original case |
| `likesCount` | Likes (null when the owner hides likes) |
| `commentsCount` | Total comments |
| `latestComments` | Latest comments: id, text, ownerUsername, ownerProfilePicUrl, ownerVerified, timestamp, likesCount, repliesCount |
| `firstComment` | Text of the first comment shown |
| `displayUrl` | Main image (or video cover) URL |
| `images` | All images of a carousel |
| `childPosts` | Carousel slides: id, type, shortCode, displayUrl, videoUrl, alt, dimensions, taggedUsers |
| `alt` | Instagram's alt text |
| `videoUrl`, `audioUrl` | Video file and audio-only track (videos and reels) |
| `videoPlayCount`, `videoViewCount`, `fbPlayCount` | Plays, legacy views and Facebook plays (videos and reels) |
| `videoDuration` | Video length in seconds |
| `musicInfo` | artist_name, song_name, uses_original_audio, should_mute_audio, should_mute_audio_reason, audio_id |
| `timestamp` | Posted at, ISO 8601 UTC |
| `dimensionsWidth`, `dimensionsHeight`, `originalWidth`, `originalHeight` | Size in pixels |
| `ownerUsername`, `ownerFullName`, `ownerId`, `ownerVerified`, `ownerProfilePicUrl` | Who posted it |
| `ownerFollowersCount` | Followers of the account you asked for |
| `taggedUsers` | Tagged accounts (all slides) with id, username, full name, verified, picture |
| `coauthorProducers` | Collab co-authors |
| `paidPartnership`, `sponsors` | Paid-partnership flag and the brands named |
| `locationName`, `locationId` | Tagged place |
| `isPinned` | Pinned to the top of the grid |
| `isCommentsDisabled`, `likeAndViewCountsDisabled` | Comment and count settings |
| `captionIsEdited`, `hasAudio` | Caption edited, video has sound |
| `inputUrl`, `scrapedAt` | Which input produced the row, and when it was read |

### Sample output

A carousel row, shortened (long URLs cut):

```json
{
  "inputUrl": "https://www.instagram.com/natgeo",
  "id": "4006...",
  "type": "Sidecar",
  "productType": "carousel_container",
  "shortCode": "DeZnnO7CBKY",
  "url": "https://www.instagram.com/p/DeZnnO7CBKY/",
  "caption": "Photo by ...",
  "hashtags": [],
  "mentions": [],
  "likesCount": 73695,
  "commentsCount": 259,
  "latestComments": [{"text": "...", "ownerUsername": "...", "timestamp": "2026-10-14T...", "likesCount": 0, "repliesCount": 0}],
  "displayUrl": "https://scontent...jpg?...",
  "images": ["https://scontent...jpg?...", "https://scontent...jpg?..."],
  "childPosts": [{"type": "Image", "displayUrl": "https://scontent...", "alt": "Photo by National Geographic ...", "dimensionsWidth": 1080, "dimensionsHeight": 1350}],
  "alt": "Photo by National Geographic on October ...",
  "timestamp": "2026-10-12T...",
  "ownerUsername": "natgeo",
  "ownerFullName": "National Geographic",
  "ownerVerified": true,
  "isPinned": false
}
```

### Input options

| Input | What it does | Default |
|---|---|---|
| `username` | Usernames, @handles, profile URLs or post and reel URLs, one per line | `["natgeo"]` |
| `resultsLimit` | Newest posts per account, up to 1000 | 20 |
| `onlyPostsNewerThan` | A date (`2025-01-31`) or a span (`7 days`, `2 weeks`, `3 months`) | none |
| `skipPinnedPosts` | Leave out pinned posts | off |
| `dataDetailLevel` | `detailedData` (comments, carousel slides, alt text, tags, music, plays) or `basicData` (grid data only, fastest) | `detailedData` |
| `maxItems` | Hard cap on rows across all accounts | none |
| `maxConcurrency` | Pages read in parallel | 20 |
| `proxyConfiguration` | Apify Proxy (default). No setup needed | Apify Proxy |

### Pricing

Pay per event: you pay for each post delivered. The only other charge is the standard Apify run-start event ($0.00005 per run). No monthly rental, no details surcharge.

| Apify plan | Price per 1,000 posts, details included |
|---|---|
| Free | $1.20 |
| Starter (Bronze) | $1.10 |
| Scale (Silver) | $1.00 |
| Business (Gold) and above | $0.40 |

Never charged: accounts that do not exist, private accounts, pages Instagram refuses, and posts removed by your date or pinned filters. The run summary (`OUTPUT` in the key-value store) shows exactly how many rows were delivered and charged.

To cap your spend, set **Max rows in total** or a maximum cost per run in Apify Console. The actor stops cleanly at the cap.

### How to run it

- **Apify Console:** paste usernames, press Start, download the table.
- **Schedule:** run it daily or weekly with `onlyPostsNewerThan: "7 days"` to collect only new posts.
- **API, Python or JavaScript:** see "Calling it from code" below.
- **Integrations:** send results to Google Sheets, Slack, Make, Zapier, n8n or a webhook from the Integrations tab.

### Reliability and blocking

Instagram rate-limits logged-out traffic. The actor uses Apify Proxy with a fresh session for every request, starts on fast datacenter IPs and moves to residential IPs on its own when Instagram pushes back. Slow requests are raced against a second attempt so a single stuck connection does not hold up the run. If a post page cannot be read, the post is still delivered from the grid (caption, likes, comments count, images, video, date) and the run log says how many posts are missing comments.

### Limits and honest caveats

- **Public accounts only.** Private accounts return a warning and nothing is charged.
- **Latest comments, not all comments.** Instagram shows logged-out visitors about 15 recent comments per post; that is what you get.
- **Play counts of old pinned reels.** Plays come from the account's reels tab, which the actor reads back as far as your newest posts reach. A reel pinned to the grid from months ago can have `videoPlayCount` empty; its `videoViewCount` is still filled.
- **Likes can be hidden.** When the owner hides like counts, `likesCount` is null.
- **Media URLs expire.** Instagram's image and video links are signed and stop working after some days. Download what you need soon after the run.
- **No hashtag or location feeds.** Those need a login. Use account names or post URLs.

### Use cases

1. **Weekly competitor report:** last 7 days of posts from five brands, sorted by likes plus comments.
2. **Engagement rate per post:** divide likes and comments by `ownerFollowersCount` in your sheet.
3. **Carousel analysis:** count slides and read their alt text to see which formats perform.
4. **Brand deal mapping:** filter `paidPartnership` or `sponsors` to see who works with whom.
5. **Location insights:** group posts by `locationName` for travel, hospitality or retail accounts.
6. **Comment sentiment:** export `latestComments` to your sentiment or support tools.

### Input guide

- `natgeo`, `@natgeo` and `https://www.instagram.com/natgeo/` all mean the same account.
- A post URL such as `https://www.instagram.com/p/DeZnnO7CBKY/` returns that post only. Reel URLs (`/reel/...`) work too.
- Hashtag, explore and story pages need a login, so they are skipped with a warning and never charged.
- Accounts and post URLs can be mixed in one input.

### Worked examples

**Last 7 days from three news accounts, no pinned posts**

```json
{
  "username": ["natgeo", "nasa", "bbcnews"],
  "resultsLimit": 100,
  "onlyPostsNewerThan": "7 days",
  "skipPinnedPosts": true
}
```

**Fastest grid export (no comments or carousel slides)**

```json
{
  "username": ["nike", "adidas"],
  "resultsLimit": 60,
  "dataDetailLevel": "basicData"
}
```

**Specific posts by URL**

```json
{
  "username": [
    "https://www.instagram.com/p/DeZnnO7CBKY/",
    "https://www.instagram.com/reel/DeeUUHNAqQj/"
  ]
}
```

### Tips to reduce cost and runtime

- Use `onlyPostsNewerThan` on scheduled runs. Paging stops at your date, so old posts are neither read nor charged.
- Set `resultsLimit` to what you will analyse. Instagram serves the grid 12 posts per page, so 12, 24 or 36 fill pages exactly.
- Use `basicData` when you only need captions, likes and images. The run gets faster; the price stays the same.
- Put many accounts in one run; accounts are processed in parallel.

### Calling it from code

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("transparent_meteorite/instagram-posts-scraper").call(
    run_input={"username": ["natgeo"], "resultsLimit": 20}
)
for post in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(post["shortCode"], post["type"], post["likesCount"], post["commentsCount"])
```

JavaScript:

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('transparent_meteorite/instagram-posts-scraper').call({
    username: ['natgeo'],
    resultsLimit: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((p) => [p.shortCode, p.likesCount]));
```

HTTP, one call that runs the actor and returns the rows:

```bash
curl -X POST "https://api.apify.com/v2/acts/transparent_meteorite~instagram-posts-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"username": ["natgeo"], "resultsLimit": 20}'
```

### Related actors

More tools from the same publisher that fit this workflow:

- [TikTok Profile Scraper](https://apify.com/transparent_meteorite/tiktok-public-profile-scraper): profile stats, bio links and recent posts for a creator list
- [Company Enrichment by Domain](https://apify.com/transparent_meteorite/company-enrichment-by-domain): enrich a domain with socials, emails and tech stack
- [Website Email Extractor](https://apify.com/transparent_meteorite/website-contact-extractor): pull emails, phones and socials from each business website
- [Website Tech Stack Detector](https://apify.com/transparent_meteorite/website-tech-stack-detector): detect the CMS, frameworks and hosting behind any site
- [Local Business Leads](https://apify.com/transparent_meteorite/local-business-leads): find local businesses with no website from OpenStreetMap, a cheap complement to Maps data
- [Shopify Leads & Store Scraper](https://apify.com/transparent_meteorite/shopify-store-leads): Shopify store leads with apps, products and contacts

Use from AI agents: every actor here is callable through the Apify MCP server (mcp.apify.com).

### FAQ

**Do I need an Instagram account or cookies?**
No. The actor reads only what Instagram shows logged-out visitors. You never share a login, so your account cannot be blocked.

**Are reels included?**
Yes. Reels that appear on the grid are returned as `type: "Video"` with `productType: "clips"`, with plays, duration, music and video URL. For reels only, use an Instagram reels scraper.

**Is there an extra charge for comments or carousel details?**
No. Detailed data is the default and costs the same as basic data.

**How many comments do I get per post?**
The latest comments Instagram shows publicly, usually about 15. `commentsCount` gives the total.

**How far back can I go?**
As far as the account's grid goes, 12 posts per page. Large `resultsLimit` values simply take more pages.

**What happens when Instagram blocks a request?**
It is retried on a fresh proxy session and then on residential IPs. Rows that still cannot be read are not charged, and the run log lists them.

**Can I get posts from a hashtag?**
Not without a login, so this actor does not offer it.

**Which export formats are there?**
JSON, CSV, Excel, XML, RSS and HTML, from the Output tab or the API.

### Terms and responsible use

The actor collects only publicly available data that Instagram shows to anyone without logging in. You are responsible for how you use it. Respect Instagram's terms, copyright in images, videos and audio, and privacy law such as the GDPR and the CCPA, especially for comment authors. Do not use the data for spam or harassment.

### Use it from AI assistants (MCP)

Connect the Apify MCP server (`https://mcp.apify.com`) to Claude, Cursor or another MCP client and add this actor as a tool. Ask, for example, "Pull the last 30 posts of @nike and tell me which format gets the most comments", and the assistant runs it for you.

### Changelog

- **0.1** (October 2026): first release. Posts by account or URL, details included in the price (latest comments, carousel slides with alt text, tagged users, music, plays), date and pinned filters, per-row pricing.

### Support

Something missing or wrong? Open an issue on the Issues tab with the run link. Requests for new fields are welcome and usually ship within days.

New to Apify? [Create a free account](https://console.apify.com/sign-up?fpr=rnmakg) and run this Actor in under a minute. Some links are affiliate links.

# Actor input Schema

## `username` (type: `array`):

Public accounts: a username (natgeo), an @handle or a profile URL (https://www.instagram.com/natgeo/). Post or reel URLs (https://www.instagram.com/p/...) return that single post.

## `resultsLimit` (type: `integer`):

Newest posts to return per account (up to 1000), photos, carousels and reels.

## `onlyPostsNewerThan` (type: `string`):

A date (2025-01-31) or a span like '7 days', '2 weeks', '3 months'. Older items are skipped and never charged.

## `skipPinnedPosts` (type: `boolean`):

Leave out items the account pinned to the top of its grid (pinned items can be old).

## `dataDetailLevel` (type: `string`):

Detailed is included in the price. Basic skips the per-post page for the fastest run.

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

Stop after this many rows across all accounts (0 = no cap). You are never charged above this.

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

How many Instagram pages to read at once.

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

Apify Proxy is used by default (datacenter first, residential automatically for retries). No setup needed.

## Actor input object example

```json
{
  "username": [
    "natgeo"
  ],
  "resultsLimit": 20,
  "skipPinnedPosts": false,
  "dataDetailLevel": "detailedData",
  "maxConcurrency": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "username": [
        "natgeo"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("transparent_meteorite/instagram-posts-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": ["natgeo"],
    "proxyConfiguration": { "useApifyProxy": True },
}

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

```

## MCP server setup

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