# Instagram Scraper (Profiles, Posts & Reels, No Login) (`locaihost/instagram-scraper`) Actor

Scrape public Instagram profiles, posts, reels and hashtag pages without logging in. Get followers, bio, links, captions, hashtags, likes, views, comment counts, post dates and image or video links. Paste usernames, post links or keywords. New-only mode for schedules. From $0.50 per 1,000 rows.

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

## Pricing

from $0.17 / 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 Scraper (Profiles, Posts & Reels, No Login)

Get public Instagram profiles, posts and reels as clean JSON, CSV or Excel rows: followers, bio and bio links, captions, hashtags, mentions, likes, views, comment counts, post dates and image or video links. Paste usernames, post links or keywords. No login, no cookies, no Instagram account.

- **Influencer and creator research:** followers, verified status and the engagement on each creator's latest posts and reels, for a shortlist of handles.
- **Competitor tracking:** what rival brands post, how often, and which posts and reels get the most likes and views.
- **Content and hashtag research:** the top public reels Instagram shows for a keyword or hashtag, with views, captions and hashtags.
- **Campaign reporting:** likes, comments and views for a list of post and reel links, with exact posting times.
- **Monitoring on a schedule:** turn on **Only new posts** and pay only for posts published since the last run.

### Quick start

Paste this into the **JSON** tab of the input and click **Start**:

```json
{"usernames": ["natgeo"], "maxPostsPerProfile": 12}
```

You get National Geographic's profile row and its 12 latest posts and reels: 13 rows, usually in under 20 seconds.

More examples:

```json
{"usernames": ["nike", "adidas", "puma"], "maxPostsPerProfile": 50, "postDetails": true}
```

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

```json
{"keywords": ["#streetfood", "home workout"], "maxPostsPerKeyword": 48}
```

Usernames, profile links, post and reel links and `/explore/tags/` links can be mixed in any list.

### What data can I get?

Three kinds of row, set by the `type` field: **profile**, **post** (posts and reels) and **unavailable** (a free row for a private, missing or unusable entry, saying why).

| Row | Fields |
|---|---|
| Profile | `username`, `fullName`, `biography`, `followersCount`, `followingCount`, `isVerified`, `externalUrl`, `bioLinks` (title and link), `hasReels`, `profilePicUrl`, `id`, `url` |
| Post, every source | `shortCode`, `url`, `postType` (image, video, reel, carousel), `ownerUsername`, `caption`, `hashtags`, `mentions`, `displayUrl`, `mediaUrls`, `date`, `id` |
| Post, from a profile | adds `likesCount`, `viewsCount` (reels and videos), `carouselCount` |
| Post, from a keyword | adds `viewsCount`, `videoUrl` |
| Detailed post | adds `takenAt` (exact time), `commentsCount`, `likesCount`, every photo and video in `mediaUrls`, `videoUrl`, `taggedUsers`, `coauthors`, `location`, `audio`, `width`, `height` |
| Every row | `type`, `details` (full, grid or keyword), `source`, `input`, `scrapedAt` |

**Detailed posts** come from each post's own page. Post and reel links always return them; for posts from profiles and keywords, turn on **Full post details ($)**.

Three real rows from runs on 2026-11-01 (shortened: image links cut, long captions trimmed):

```json
[
  {
    "type": "profile",
    "username": "nasa",
    "fullName": "NASA",
    "biography": "Making the seemingly impossible, possible. ✨",
    "followersCount": 104414959,
    "followingCount": 90,
    "isVerified": true,
    "externalUrl": "https://www.nasa.gov",
    "bioLinks": [{"title": "NASA.gov Homepage", "url": "https://www.nasa.gov"}, {"title": "MAX POWER", "url": "https://www.nasa.gov/maxpower"}],
    "hasReels": true,
    "profilePicUrl": "https://scontent-dfw5-2.cdninstagram.com/v/t51.2885-19/29090...",
    "id": "17841401474538262",
    "url": "https://www.instagram.com/nasa/",
    "input": "nasa",
    "scrapedAt": "2026-11-01T12:04:56.095Z"
  },
  {
    "type": "post",
    "id": "4004634989362489982",
    "shortCode": "DeTUk4sDSp-",
    "url": "https://www.instagram.com/reel/DeTUk4sDSp-/",
    "postType": "reel",
    "ownerUsername": "nasa",
    "caption": "POV: you're watching the Earth set\n\nWe just released hundreds of new images and hours of new audio from our Artemis II mission around the Mo...",
    "hashtags": ["NASA", "ArtemisII", "Artemis"],
    "mentions": [],
    "likesCount": 765683,
    "commentsCount": null,
    "viewsCount": 11218359,
    "takenAt": null,
    "date": "2026-10-10",
    "displayUrl": "https://scontent-dfw5-1.cdninstagram.com/v/t51.82787-15/8421...",
    "details": "grid",
    "source": "nasa"
  },
  {
    "type": "post",
    "id": "4020388264128348382",
    "shortCode": "DfLSdNGhQDe",
    "url": "https://www.instagram.com/reel/DfLSdNGhQDe/",
    "postType": "reel",
    "ownerUsername": "airbnb",
    "caption": "Come for the castle. Stay because nobody wants to be the first to check what’s making that noise.\n\n📍 Airbnb Luxe | The Castle, Norfolk, UK",
    "likesCount": 441,
    "commentsCount": 23,
    "viewsCount": 45105,
    "takenAt": "2026-10-31T23:00:05.000Z",
    "date": "2026-10-31",
    "videoUrl": "https://scontent-ord5-1.cdninstagram.com/o1/v/t2/f2/m86/AQOf...",
    "audio": "Original audio",
    "width": 1080,
    "height": 1920,
    "details": "full",
    "source": "airbnb"
  }
]
```

### How much does it cost?

You pay per row returned. There is no charge for Apify platform usage on top.

| Row | Free and Starter | Scale | Business |
|---|---|---|---|
| Post (from a profile or keyword) | $0.30 per 1,000 | $0.225 per 1,000 | $0.165 per 1,000 |
| Profile | $0.50 per 1,000 | $0.375 per 1,000 | $0.275 per 1,000 |
| Detailed post (post links, or Full post details on) | $0.50 per 1,000 | $0.375 per 1,000 | $0.275 per 1,000 |

A detailed post is charged instead of a post, never on top. Plus $0.00005 per run start. **Apify's free $5 monthly credit covers about 16,000 posts.** Free-plan runs stop at 1,000 rows each; any paid Apify plan removes the cap.

**What's free:** private accounts, accounts and posts that don't exist, keywords with no public page and entries that aren't Instagram usernames or links (each comes back as a free `unavailable` row saying why), and posts skipped by **Only new posts**. A run that returns nothing because of the input costs nothing. To cap a run's spend, set **Maximum cost per run** in the run options, or **Max rows** in the input.

### Limits, stated up front

- **Public accounts only.** The Actor reads what a signed-out visitor can see. Private accounts return a free row and nothing else; so do accounts Instagram protects as a child's.
- **Not available to signed-out visitors, so not in the output:** the exact post count, business category, contact buttons, follower and following lists, stories and comment text.
- **Profile posts** come newest first (pinned posts can come first), 12 per request, as many as you ask for. Posts a profile collaborated on appear in its list with the other account as `ownerUsername`.
- **Posts from profiles and keywords carry what the list shows.** From a profile: likes, views and the posting date, without comment counts or the exact time. From a keyword: views and the owner, without likes. Turn on **Full post details ($)** to fill those in from each post's own page.
- **Keywords and hashtags:** Instagram sends signed-out visitors who open a hashtag (`/explore/tags/travel/`) to its public keyword page, which lists top reels for the word, not every post with the tag. Common words have one; rare ones may not (free row). Instagram decides how far each page goes; when it ends before your limit, the run says so.
- **Likes and views are `null` when the owner hides them**, never 0. Plays (`viewsCount`) exist for reels and videos only.
- **Image and video links** are Instagram's signed links and stop working after a few days. Download what you need soon after the run.
- **Email addresses and phone numbers are removed** from bios and captions (replaced by `[email removed]` and `[phone removed]`), and WhatsApp, phone and email links are left out of `bioLinks`.

### Only new since last run, and schedules

Turn on **Only new posts** and schedule the Actor daily or weekly. Each run looks at the same window (for example the latest 12 posts per profile) and returns only the posts in it that earlier runs with the same input haven't returned; skipped posts cost nothing, and the run never digs into older posts to make up the number. Profile rows always come back, so follower counts stay current. Set up a schedule under **Schedules** in Apify Console.

### Integrations: API, n8n, Make and AI agents

**API.** Run it and get the rows back in one call:

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

Apify's API clients for Python and JavaScript work the same way.

**n8n, Make, Zapier, Google Sheets, Slack, webhooks.** Apify's built-in integrations send each run's dataset wherever you need it, for example a weekly sheet of competitors' new posts with likes and views.

**AI agents (MCP).** Add this Actor to Claude, Cursor or any MCP client with `https://mcp.apify.com/?tools=locaihost/instagram-scraper`, then ask something like *"Which of Nike's last 30 Instagram reels got the most views?"*

### FAQ

#### How much does it cost to scrape Instagram?

$0.30 per 1,000 posts and $0.50 per 1,000 profiles or detailed posts on the Free and Starter plans, less on Scale and Business. Apify's free $5 monthly credit covers about 16,000 posts.

#### Can I use it through the API or from Python?

Yes. Use the `run-sync-get-dataset-items` call above, or Apify's Python and JavaScript clients. Every run's data is also available as JSON, CSV or Excel from its dataset.

#### Can I use it from an AI agent?

Yes. Through the Apify MCP server (`https://mcp.apify.com/?tools=locaihost/instagram-scraper`) any MCP client can call it with usernames, links or keywords and read the rows back.

#### Do I need an Instagram account or cookies?

No. The Actor never logs in and never asks for cookies or passwords. It reads only what Instagram shows a signed-out visitor.

#### Is it legal to scrape Instagram?

The Actor collects only public information a signed-out visitor can see, and never logs in. Instagram's terms restrict automated collection, so check them against your use. Private accounts are skipped, and email addresses and phone numbers are removed from bios and captions. You are responsible for how you use the results, including Instagram's terms and the data-protection law that applies to you (for example GDPR when you process data about people in the EU).

#### Why are some fields empty?

Each source shows different things: profile lists have no comment counts or exact times, keyword pages have no likes, and only detailed posts carry tagged accounts, location and audio. Turn on **Full post details ($)** for the most complete rows. Likes and views are `null` when the owner hides them.

### More from locaihost data

- [TikTok creator analytics](https://apify.com/locaihost/tiktok-creators): followers, engagement and posting cadence for TikTok creators.
- [Pinterest scraper](https://apify.com/locaihost/pinterest-scraper): pins, boards and profiles from public Pinterest pages.
- [YouTube transcripts](https://apify.com/locaihost/youtube-transcripts): what creators say in their videos, as text.
- [Google Trends data](https://apify.com/locaihost/google-trends): search interest in a brand or topic over time.

### Did it help?

If this saved you time, a quick rating on the Store helps other people find it.

### Support

Something not working, or a field you need? Open an issue on the **Issues** tab: we answer issues within 24 hours.

# Changelog

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

# Actor input Schema

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

Instagram usernames (natgeo, @natgeo) or profile links (https://www.instagram.com/natgeo/). Each returns a profile row (name, bio, followers, following, verified, links) and the profile's latest posts and reels, newest first (see Posts per profile).

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

Links to single posts or reels (/p/..., /reel/..., /tv/...). Each returns that post with full details: exact time, likes, comment count, every photo or video in it, tagged accounts, location and audio.

## `keywords` (type: `array`):

Keywords or hashtags (travel, #travel, vegan recipes). Each returns the top public reels Instagram shows a signed-out visitor for it: Instagram sends signed-out hashtag links (/explore/tags/...) to this page. Common words work best; rare ones may have no public page (free row, nothing charged).

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

Latest posts and reels to return for each username, newest first (pinned posts can come first). 0 returns the profile row only.

## `maxPostsPerKeyword` (type: `integer`):

Most reels to return for each keyword. Instagram decides how far each public keyword page goes; when it ends sooner, the run says so.

## `postDetails` (type: `boolean`):

Open every post from profiles and keywords on its own page for the exact time, comment count, every photo and video in it, tagged accounts, location and audio. These rows are charged as detailed posts instead of posts. Off: profile posts carry caption, hashtags, mentions, likes, views, date and image; keyword posts carry caption, views, owner and video link. Post and reel links always return full details.

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

Of the latest posts (Posts per profile / per keyword), return only those this input hasn't returned in an earlier run. For daily or weekly schedules. Skipped posts are not charged. Profile rows are always returned (their counts change).

## `maxResults` (type: `integer`):

Stop after this many charged rows in total. 0 means no limit (the run's maximum charge still applies).

## Actor input object example

```json
{
  "usernames": [
    "natgeo",
    "nasa",
    "https://www.instagram.com/nike/"
  ],
  "postUrls": [
    "https://www.instagram.com/p/DfK5HEmGlai/",
    "https://www.instagram.com/reel/DfAWxdIFmVB/"
  ],
  "keywords": [
    "travel",
    "#streetfood",
    "home workout"
  ],
  "maxPostsPerProfile": 12,
  "maxPostsPerKeyword": 24,
  "postDetails": false,
  "onlyNew": false,
  "maxResults": 0
}
```

# Actor output Schema

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

One row per post or reel: caption, hashtags, likes, comments, views, date, media links.

## `profiles` (type: `string`):

One row per profile: name, bio, followers, following, verified, website.

## `full` (type: `string`):

Every field of every row, including free rows.

## `summary` (type: `string`):

Counts, free rows by reason, anything that failed, access stats and cost.

# 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": [
        "natgeo"
    ],
    "maxPostsPerProfile": 12
};

// Run the Actor and wait for it to finish
const run = await client.actor("locaihost/instagram-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": ["natgeo"],
    "maxPostsPerProfile": 12,
}

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

```

## MCP server setup

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