# Instagram Post Scraper: Captions, Likes, Comments, No Login (`one_dollar_store/instagram-post-scraper`) Actor

Instagram post scraper for public profiles and post links: caption, hashtags, likes, comments, publish time, location, tagged accounts, image and video links, views for videos. Up to 12 latest posts per profile. No login. $1 per 1,000 results, platform usage included.

- **URL**: https://apify.com/one_dollar_store/instagram-post-scraper.md
- **Developed by:** [One Dollar Store](https://apify.com/one_dollar_store) (community)
- **Categories:** Social media
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 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?

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: captions, likes, comments and dates from public profiles

**$1 per 1,000 posts. Platform usage included. No rental, no minimum.**

Give it Instagram usernames or post links and get one row per post: post ID, shortcode, link, type (photo, carousel, video or reel), full caption with its hashtags and mentions, like and comment counts, publish time, location, owner, coauthors, tagged accounts, image and video links, carousel items, and for videos the views, length and audio. It reads the public pages Instagram shows to any visitor. No login, no cookies, no follower lists.

[Open it in Apify Console](https://console.apify.com/actors/iCr3fdNjdEa5cRmkh/input)

### What does Instagram Post Scraper cost?

| Posts | This actor |
|---|---|
| 1,000 | $1.00 |
| 10,000 | $10.00 |
| 100,000 | $100.00 |

One flat price, platform usage included, so there is no separate compute or proxy bill. A daily run over 50 brand profiles with their 12 latest posts each is 600 posts, about $0.60 a day or about $18 a month. Posts that are skipped by your date filter, profiles that do not exist and profiles Instagram refuses are not charged.

### Why use it

- **Full post records.** Each post is read from its own public page, so you get the exact publish time, exact like and comment counts, the whole caption, location name and ID, coauthors of collab posts and tagged accounts, not only a preview.
- **Video details included.** For videos and reels the row also has views, length in seconds, whether it has sound, the audio title and artist, and a link to the video file.
- **Profiles or single posts.** Mix usernames and post links in one run. A date filter keeps only posts newer than a day you choose.
- **IDs for joining.** Post ID, shortcode and owner ID stay the same when captions or usernames change, so you can track the same posts over time.

### How to use Instagram Post Scraper

1. Open the actor, add one username per line (or a profile link), press **Start**.
2. Or paste this input:

```json
{ "usernames": ["nasa", "peakdesign"], "maxPostsPerProfile": 6, "maxItems": 12 }
```

3. Download the results as JSON, CSV or Excel, or read them through the API.

### Use it from code

```bash
curl -X POST "https://api.apify.com/v2/acts/one_dollar_store~instagram-post-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"usernames": ["nasa", "peakdesign"], "maxPostsPerProfile": 12, "maxItems": 100}'
```

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("one_dollar_store/instagram-post-scraper").call(
    run_input={"usernames": ["nasa", "peakdesign"], "maxPostsPerProfile": 12, "maxItems": 100}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["postedAt"], item["ownerUsername"], item["likeCount"], item["url"])
```

### Use it from an AI assistant

Claude, ChatGPT, Cursor and other assistants can call this actor through Apify's MCP server. Add it with this server address:

```
https://mcp.apify.com?tools=one_dollar_store/instagram-post-scraper
```

Then ask, for example: "Get the 12 latest Instagram posts of @nasa with likes, comments and dates."

### Switching from another Instagram post scraper

Most Instagram post actors take a list of usernames or post links and a limit. Here they are `usernames`, `postUrls`, `maxPostsPerProfile` and `maxItems`. The core output fields are `shortcode`, `url`, `type`, `caption`, `likeCount`, `commentCount`, `postedAt` and `ownerUsername`.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `usernames` | list of text | none | Usernames or profile links, for example `natgeo`, `@natgeo` or `https://www.instagram.com/natgeo/`. |
| `postUrls` | list of text | none | Links to single posts or reels (`/p/...`, `/reel/...`). One row each. |
| `maxPostsPerProfile` | number | 12 | Latest posts per profile, 1 to 12. |
| `newerThan` | date | none | `YYYY-MM-DD`. Older posts are skipped and not charged. |
| `maxItems` | number | 100 | Total posts for the run, 10 to 100,000. |
| `proxyConfiguration` | object | Apify proxy | Data center proxy by default. Its cost is included in the price. |

Give at least one username or post link.

### What data does Instagram Post Scraper return?

| Field | Meaning |
|---|---|
| `postId`, `shortcode`, `url` | Instagram ID, the short code and the link (reels use `/reel/`). |
| `type`, `productType` | `photo`, `carousel`, `video` or `reel`, and Instagram's own label. |
| `ownerUsername`, `ownerId`, `ownerFullName`, `ownerIsVerified` | The account that published it. For a collab post this can be a partner of the profile you asked for. |
| `postedAt` | Publish time, ISO 8601 in UTC. |
| `caption`, `captionEdited`, `hashtags`, `mentions` | Full caption, whether it was edited, and the hashtags and @mentions in it. |
| `likeCount`, `commentCount`, `countsHidden` | Counts as Instagram shows them; likes are left out when the owner hides them. |
| `viewCount`, `videoDurationSecs`, `hasAudio` | Videos and reels: views, length, sound. |
| `audioTitle`, `audioArtist`, `audioId`, `usesOriginalAudio` | Videos and reels: the song or original audio. |
| `locationName`, `locationId` | Tagged location. |
| `isPinned`, `isPaidPartnership`, `sponsors` | Pinned flag (known for posts from the profile card), paid partnership label and brand partners. |
| `coauthors`, `taggedUsers` | Usernames of collab coauthors and of tagged accounts. |
| `accessibilityCaption` | Instagram's description of the image. |
| `displayUrl`, `videoUrl`, `width`, `height` | Image or cover link, video file link, original size. |
| `carouselCount`, `carouselItems` | Carousels: number of items and each item's ID, type, image and video link. |
| `requestedProfile`, `requestedUrl`, `feedPosition`, `source`, `scrapedAt` | Which input found it, its position on the profile, which public pages it was read from, and when. |

### Sample results

Real rows from test runs on 6 November 2026 (captions and links shortened).

```json
[
  {"postId": "4021095312734048310", "shortcode": "DfNzOHbgFA2", "url": "https://www.instagram.com/p/DfNzOHbgFA2/", "type": "carousel", "ownerUsername": "adidas", "ownerFullName": "adidas", "postedAt": "2026-11-01T22:25:37.000Z", "caption": "YOUR NEW WORLD CHAMPION 💙​\n​\nThe youngest ever. First Italian champion since ’53.🏆 Cong...", "likeCount": 290359, "commentCount": 425, "locationName": "Autodromo Hermanos Rodriguez", "locationId": "491332271372801", "coauthors": ["adidasmotorsport"], "taggedUsers": ["mercedesamgf1", "kimi.antonelli", "adidasmotorsport"], "carouselCount": 4, "width": 1080, "height": 1440, "requestedProfile": "adidas", "feedPosition": 4, "source": "profile page and card, post page"},
  {"postId": "4023389236945569299", "shortcode": "DfV8zG1RUYT", "url": "https://www.instagram.com/p/DfV8zG1RUYT/", "type": "photo", "ownerUsername": "nasaaero", "ownerFullName": "NASA Aeronautics", "postedAt": "2026-11-05T02:25:45.000Z", "caption": "🚨 BREAKING: Introducing X-70 Fractal, @nasa’s newest experimental aircraft! \n\nThis crew...", "mentions": ["nasa", "nasaadmin"], "likeCount": 153599, "commentCount": 577, "coauthors": ["nasa", "nasaadmin"], "taggedUsers": ["nasa", "nasaadmin"], "width": 1680, "height": 960, "requestedProfile": "nasa", "feedPosition": 1, "source": "profile card, post page"},
  {"postId": "3536981079146171046", "shortcode": "DEV4Y0_yQqm", "url": "https://www.instagram.com/reel/DEV4Y0_yQqm/", "type": "reel", "ownerUsername": "1tomplumber", "ownerFullName": "1-Tom-Plumber", "postedAt": "2025-01-02T23:39:25.000Z", "caption": "God bless our emergency plumbers 🫡\n\n#plumber #drains #happynewyear", "hashtags": ["plumber", "drains", "happynewyear"], "likeCount": 159, "commentCount": 13, "viewCount": 17438, "videoDurationSecs": 33.95, "audioTitle": "Slow It Down (Instrumental)", "audioArtist": "Deuxhyun", "width": 1080, "height": 1920, "requestedProfile": "1tomplumber", "feedPosition": 1, "source": "profile page and card, post page, post embed"},
  {"postId": "4007938272349758937", "shortcode": "DefDp-tGaXZ", "url": "https://www.instagram.com/p/DefDp-tGaXZ/", "type": "carousel", "ownerUsername": "peakdesign", "ownerFullName": "Peak Design", "postedAt": "2026-10-14T18:44:55.000Z", "caption": "We just re-certified as a B Corp. It was a lot harder this time. (That’s a good thing.)...", "likeCount": 557, "commentCount": 15, "taggedUsers": ["bcorporation"], "carouselCount": 5, "width": 3276, "height": 4095, "requestedProfile": "peakdesign", "feedPosition": 5, "source": "profile card, post page"}
]
```

### Limits

- **Up to 12 posts per profile.** A visitor who is not logged in sees at most the 12 posts at the top of a profile (pinned posts first, then the newest). Instagram asks for a log in after that, and this actor never logs in. For older posts, give their links in `postUrls`.
- **Sometimes only the 6 latest.** Posts 1 to 6 come from the public profile card, which answers reliably. Posts 7 to 12 need the profile page, and Instagram refuses many data center addresses there. The actor tries 5 addresses; a capped share of profiles (20 percent of those started, none in a run of 1 to 4 profiles) gets one more try through residential proxy. When all of that is refused you get the 6 latest posts for that profile, and the run summary says so.
- **Refused profiles are not charged.** On a day when Instagram refuses most addresses, some profiles are not read. They are listed in the run summary, and the run stops after 6 profiles in a row that were refused on every try. Run them again later.
- **No comments text, no likers, no follower lists.** Only counts.
- **Views are for videos and reels only.** Reel plays (the number on the reels tab) are in the companion Instagram Reels Scraper.
- **Pinned flag** is known only for posts that also appear on the profile card.
- **Image and video links expire** after a few days, as all Instagram media links do. Download what you need soon after the run.
- **Speed.** Each post is read from its own large public page. A 1,000 post test on the default 256 MB delivered about 0.8 posts a second, so a big list takes a while. The price per post is the same at any memory size.
- Every run writes a `RUN_SUMMARY` record with counts, the profiles that were missing or refused, and how many reads each kind of page needed.

### FAQ

**How much does it cost to scrape 10,000 Instagram posts?**
$10.00 for the posts. Platform usage is included.

**Do I pay for compute or proxy on top?**
No. Compute, data center proxy and the capped residential reads are all inside the $1 per 1,000 price.

**Why did I get 6 posts for a profile when I asked for 12?**
Instagram refused the profile page on every try for that profile, so only the profile card was read. Run that profile again later.

**Can I get more than 12 posts per profile?**
Not by username. Logged out, Instagram stops at 12. You can pass any number of post links in `postUrls`, and each one is read in full.

**Can I filter by date?**
Yes. Set `newerThan` to a date such as `2026-10-01`. Older posts are skipped and not charged.

**Is it legal?**
The actor reads public pages that Instagram shows to any visitor, with no login and no cookies, and returns only what the account holder published. Instagram's robots.txt asks automated visitors to stay away from all pages, and Instagram's Terms of Use (section 4.2) bar collecting information in an automated way without its permission. The actor reads at a polite rate and stops when it is refused, but whether you may use it is for you to judge. Captions, usernames and tagged accounts can be personal data under laws such as GDPR. You are responsible for lawful use, including a legal basis for storing the data and the rules on marketing messages.

**Is this an official Instagram product?**
No. It is an independent tool and is not affiliated with or endorsed by Instagram or Meta.

### Feedback and support

Found a problem or want a field added? Open an issue on the Issues tab of this actor and it gets read. If the actor saved you time, an honest rating on the Reviews tab helps other people find it.

**Do I need an Apify account?**
Yes. Actors run from an Apify account, and a free account is enough to start: it includes $5 of platform usage every month. You can [sign up here](https://www.apify.com?fpr=ymnoit). This is a referral link and it costs you nothing.

### More from The One Dollar Store

Every actor here costs $1 per 1,000 results, platform usage included. See the whole store: https://apify.com/one_dollar_store

**Social media**

- [Threads Scraper](https://apify.com/one_dollar_store/threads-post-scraper): Public Threads posts by keyword or profile.
- [Instagram Profile Scraper](https://apify.com/one_dollar_store/instagram-profile-data-scraper): Followers, posts and engagement for public profiles.
- [TikTok Hashtag Scraper](https://apify.com/one_dollar_store/tiktok-hashtag-videos-scraper): Videos, views and creators for any hashtag.
- [Pinterest Pin Search Scraper](https://apify.com/one_dollar_store/pinterest-pin-search-scraper): Public pins with images and outbound links.
- [Telegram Channel Scraper](https://apify.com/one_dollar_store/telegram-channel-posts-scraper): Posts, views and media from public channels.
- [Xiaohongshu Scraper](https://apify.com/one_dollar_store/xiaohongshu-explore-feed-scraper): RedNote notes from the public explore feeds.
- [Facebook Ad Library Scraper](https://apify.com/one_dollar_store/facebook-ad-library-scraper): Meta ads by keyword or advertiser page.
- [Username Availability Checker](https://apify.com/one_dollar_store/username-availability-checker): Check if a username is free across sites.
- [Podcast Episodes Scraper](https://apify.com/one_dollar_store/podcast-episodes-scraper): Episodes from Apple Podcasts and RSS feeds.
- [Threads Profile Scraper](https://apify.com/one_dollar_store/threads-profile-posts-scraper): Public posts and follower counts for Threads profiles.

### Changelog

- November 2026: first release.

# Actor input Schema

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

Instagram usernames or profile links, for example natgeo, @natgeo or https://www.instagram.com/natgeo/. You get one row per post. Logged out, Instagram shows up to 12 posts per profile.

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

Links to single posts or reels, for example https://www.instagram.com/p/DfSpEYQEgMy/. Each link gives one row. You can use this with or without profiles.

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

How many of the latest posts to read from each profile, 1 to 12. Up to 6 come from the profile card, which always answers; 7 to 12 need the profile page, which Instagram sometimes refuses (then you get the 6 latest). Pinned posts come first when the profile page is read.

## `newerThan` (type: `string`):

Optional date in the form YYYY-MM-DD. Posts published before it are skipped and not charged.

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

The run stops after this many posts. You pay only for the posts delivered.

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

Apify data center proxy is the default and serves nearly every request. A few profile page reads may move to Apify residential proxy when every data center try is refused; that is capped per run and included in the price.

## Actor input object example

```json
{
  "usernames": [
    "nasa",
    "https://www.instagram.com/peakdesign/"
  ],
  "postUrls": [
    "https://www.instagram.com/p/DfSpEYQEgMy/"
  ],
  "maxPostsPerProfile": 6,
  "newerThan": "2026-10-01",
  "maxItems": 12,
  "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 = {
    "usernames": [
        "nasa",
        "peakdesign"
    ],
    "maxPostsPerProfile": 6,
    "maxItems": 12,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("one_dollar_store/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 = {
    "usernames": [
        "nasa",
        "peakdesign",
    ],
    "maxPostsPerProfile": 6,
    "maxItems": 12,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("one_dollar_store/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 '{
  "usernames": [
    "nasa",
    "peakdesign"
  ],
  "maxPostsPerProfile": 6,
  "maxItems": 12,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call one_dollar_store/instagram-post-scraper --silent --output-dataset

```

## MCP server setup

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