# Instagram Super Scraper - Profiles, Posts, Reels and Ads (`s-r/instagram-super-scraper`) Actor

Scrape public Instagram profiles with their full post history, Reels tab and the Instagram ads they run, plus posts by URL, keyword search volume, trending topics and places. Exact likes, comments and views, collaborators, tagged accounts, audio and link-in-bio URLs. No login.

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

## Pricing

from $0.80 / 1,000 post or reels

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 Super Scraper: profiles, full post history, reels and ads

Scrape any public Instagram profile with its **complete post history**, its **Reels tab**
and the **Instagram ads it runs**, in one run. The same Actor also reads posts and reels
by URL, Instagram keyword search volume, trending topics and places.

### What you get

- **Profiles**: exact follower, following, post and reel counts, full biography, every
  link-in-bio URL, website, category, business and creator flags, verified status, email
  addresses written in the bio, and up to 49 profiles Instagram itself lists as related.
- **Full post history**: every post back through the account's history, newest first, up
  to 1000 per profile. Exact likes and comments, views on every video, caption, hashtags,
  mentions, tagged accounts, collaborators, paid-partnership flag, place with coordinates,
  audio, carousel images and download URLs.
- **Reels tab**: the profile's reels with play counts, duration and audio id, including
  reels it made together with other accounts.
- **Instagram ads, joined to the profile**: the ads the account runs on Instagram in Meta's
  Ad Library, with creative text, landing URL, start date, and whether each ad ran on
  Instagram only or on other Meta placements too. The profile row gets the advertiser
  summary: total Instagram ads, Instagram-only ads and the newest ad's start date.
- **Paid next to organic**: per profile, how many of the returned posts are paid
  partnerships, next to how many ads the account runs.
- **Posts and reels by URL**, with optional comments.
- **Keyword search volume**: reel counts per Instagram search term, related keywords,
  related topics and the top reels behind each term.
- **Trending topics** and **places** with address, coordinates and post counts.

### Why scrape Instagram profiles and ads together

Most Instagram scrapers stop at a profile's latest dozen posts, and most ad library tools
know nothing about Instagram beyond a placement flag. Brands, agencies and analysts end up
running two tools and matching the results by hand, usually on the brand name, which
attaches the wrong page's ads as soon as a name is shared by a fan page or a regional
account.

This Actor joins them on the one key that cannot be ambiguous: the advertiser page's own
Instagram handle. An ad is attached to a profile only when the Ad Library page's Instagram
handle is exactly that profile's username. A lookalike page is never used, and the profile
row says so plainly when the account does not advertise.

Because the full post history is included, the organic side of the comparison is complete
too: every post with exact engagement, rather than an estimate from the most recent few.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `searchType` | select | `profile` | Profile, keyword, URL, location or trending |
| `search` | list | `["glossier"]` | Usernames, keywords, Instagram URLs or place IDs |
| `maxPostsPerProfile` | integer | 24 | Posts per profile, newest first, up to 1000 |
| `maxReelsPerProfile` | integer | 0 | Reels from the Reels tab per profile, up to 1000 |
| `includeAds` | boolean | true | Add the profile's Instagram ads and advertiser summary |
| `maxAdsPerProfile` | integer | 20 | Ad rows per profile; 0 keeps only the summary |
| `adsCountry` | string | `US` | Country whose Ad Library to read |
| `activeAdsOnly` | boolean | true | Only ads running now |
| `includeComments` | boolean | false | Attach comments to posts (12 newest per profile) |
| `maxComments` | integer | 20 | Comments per post |
| `mode` | select | `both` | Keyword input: keywords, reels, or both |
| `maxKeywords` | integer | 25 | Keyword input: keyword pages to fetch |
| `expandRelated` | integer | 0 | Keyword input: depth of related keywords to follow |
| `maxReels` | integer | 50 | Keyword input: reel rows from keyword pages |
| `includeTrending` | boolean | false | Also return trending topics |

Instagram links are recognised automatically whatever `searchType` says.

### Output

Every row has a `record_type`: `profile`, `reel` (posts and reels), `ad`, `keyword`,
`location`, `trending_topic` or `category`.

```json
{
  "record_type": "profile",
  "username": "gymshark",
  "followers": 8665730,
  "posts_count": 7412,
  "category": "Sportswear Store",
  "bio_links": [{"title": "Shop", "url": "https://www.gymshark.com/"}],
  "related_profiles": ["gymsharkwomen", "gymsharktrain"],
  "ads_status": "ok",
  "advertiser_page_name": "Gymshark",
  "instagram_ads_total": 780,
  "instagram_only_ads_returned": 6,
  "newest_ad_started": "2026-08-13",
  "posts_returned": 26,
  "paid_partnership_posts": 0
}
```

```json
{
  "record_type": "reel",
  "url": "https://www.instagram.com/p/DdrzbfFmw-p/",
  "owner_username": "glossier",
  "likes": 2149,
  "comments_count": 33,
  "views": null,
  "posted_at": "2026-09-24T21:01:52Z",
  "tagged_users": ["samaharris", "libraebakery"],
  "coauthors": [],
  "is_paid_partnership": false,
  "engagement_rate": 0.0686
}
```

```json
{
  "record_type": "ad",
  "ad_id": "1895443208225966",
  "page_name": "Gymshark",
  "ig_username": "gymshark",
  "publisher_platform": ["FACEBOOK", "INSTAGRAM", "AUDIENCE_NETWORK", "MESSENGER", "THREADS"],
  "is_instagram_only": false,
  "start_date": "2026-07-13",
  "link_url": "https://www.gymshark.com/collections/must-have"
}
```

The run's `summary` record counts rows per type; `errors` lists per-target problems such as
a private account or a profile that does not exist.

### Use cases

**Competitor research for brands.** Put your competitors' usernames in and get, for each,
everything they posted this year with exact engagement, every reel with its view count, and
every ad they run on Instagram right now. Seeing paid and organic side by side shows which
products a competitor pushes with money and which it lets carry themselves.

**Influencer vetting for agencies.** Engagement rate on the full post history, not the last
twelve posts, separates steady creators from one viral hit. Paid-partnership counts and
collaborator lists show who a creator already works with, and bio emails and link-in-bio
URLs give you the contact route.

**Ad intelligence for performance marketers.** The Instagram-only flag separates creative
made for Instagram from campaigns that just include it. Start dates show how long an ad has
survived, which is the closest public signal to which creative works.

**Trend and keyword research for content teams.** Keyword pages give reel volume and
related terms for Instagram search, and trending topics show what Instagram itself is
surfacing, so content can be planned around what people search for on Instagram rather
than on Google.

### How it compares

| | This Actor | Typical Instagram scraper | Typical Ad Library scraper |
|---|---|---|---|
| Post history | Up to 1000 per profile | Often the latest 12 to 50 | None |
| Reels tab with play counts | Yes | Separate actor | None |
| Instagram ads per profile | Yes, joined on the Instagram handle | None | Yes, matched on page name |
| Related profiles, link-in-bio URLs | Yes | Sometimes | None |
| Keyword search volume | Yes | None | None |
| Full comment threads | 12 to 15 per post, like the public page | Varies | None |

What others have that this does not: follower lists, likers and stories, which Instagram
only shows to logged-in users.

### Pricing

Pay per event: one event per profile, per post or reel, per ad, and per keyword, place or
trending row that reaches your dataset. See the pricing tab for the current rates. All
pricing is pay-per-event, you only pay for results you receive. No actor-start fee, no
per-compute-unit charges.

### Limits and gotchas

- Public data only. Private accounts return the profile row and no posts, with a
  `private_account` note in `errors`.
- Comments are read for the 12 newest posts per profile, 12 to 15 per post, which is what
  the public post page shows.
- Some profile details (bio links, category, related profiles) are occasionally
  unavailable for an account; the row then still carries counts, name and recent posts.
- Ads are matched only on an exact Instagram handle. `ads_status: no_advertiser_page_found`
  means no Ad Library page claims that handle in the chosen country, not that the brand
  never advertises elsewhere.
- Free Apify plans return up to 10 rows per run.
- Deep crawls take time: 1000 posts for one profile is about 84 page reads.

### FAQ

**Can I scrape an Instagram profile's full post history without logging in?**
Yes. Set `maxPostsPerProfile` up to 1000 and the Actor pages back through the account's
public posts, newest first.

**How do I see which Instagram ads a brand is running?**
Leave `includeAds` on and put the brand's username in `search`. Ads come back as `ad` rows
and the profile row gets the totals.

**Does it scrape Instagram reels with view counts?**
Yes. Posts that are videos carry views, and `maxReelsPerProfile` adds the Reels tab with
play counts and audio ids.

**Can I get Instagram engagement rate for influencers?**
Every post row has `engagement_rate` (likes as a share of followers) and videos have
`like_to_view_rate`.

**Does it find emails on Instagram profiles?**
It returns email addresses written in the public biography in `bio_emails`, plus every
link-in-bio URL. Business contact buttons are not shown to logged-out visitors.

### Related Actors

- [Instagram Ads Library Scraper](https://apify.com/s-r/instagram-ads-library)
- [Instagram Profile Scraper](https://apify.com/s-r/instagram-profile-scraper)
- [Instagram Keyword Scraper](https://apify.com/s-r/instagram-keyword-scraper)

# Actor input Schema

## `searchType` (type: `string`):

Profile takes usernames and returns the account, its posts, its Reels tab and its Instagram ads. Keyword reads Instagram's public search-term pages with reel volume and related keywords. URL accepts any post, reel or profile link. Location takes place IDs. Trending ignores your input and reads Instagram's trending topics. Instagram links are always detected automatically, whatever you pick here.

## `search` (type: `array`):

Usernames like 'glossier' or '@glossier', keywords like 'skincare', Instagram URLs, or numeric place IDs, matching the type above.

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

Posts to return per profile, newest first, back through the account's full history. Each post has exact likes, comments, views on videos, tagged accounts, collaborators, place and audio.

## `maxReelsPerProfile` (type: `integer`):

Reels to return from each profile's Reels tab, with play counts and audio. Includes reels made together with other accounts. Reels already returned as posts are returned once. 0 skips the Reels tab.

## `includeAds` (type: `boolean`):

Look up each profile in Meta's Ad Library and return the ads it runs on Instagram, next to its organic posts. Only an advertiser page whose Instagram handle is exactly the profile's username is used, so a lookalike page never gets attached. The profile row also gets the advertiser summary: total Instagram ads, Instagram-only ads and the newest ad's start date.

## `maxAdsPerProfile` (type: `integer`):

Ads to return per profile. 0 keeps the advertiser summary on the profile row without returning ad rows.

## `adsCountry` (type: `string`):

Two-letter country whose Ad Library to read, e.g. US, GB, NL, DE.

## `activeAdsOnly` (type: `boolean`):

Return only ads that are running now. Off returns past ads too.

## `includeComments` (type: `boolean`):

Attach comments to posts and reels: author, text, likes, time and reply linkage. For profiles, comments are read for the 12 newest posts. Comments are nested in the post row and cost nothing extra.

## `maxComments` (type: `integer`):

Upper bound on comments attached to each post. Instagram shows roughly 12 to 15 per post without a login.

## `mode` (type: `string`):

For keyword input: keyword rows (reel volume and related keywords), the reels behind them, or both.

## `maxKeywords` (type: `integer`):

For keyword input: cap on keyword pages fetched, including related ones.

## `expandRelated` (type: `integer`):

For keyword input: how many levels of Instagram's related keywords to follow. 0 returns only your keywords.

## `maxReels` (type: `integer`):

For keyword input: cap on reel rows from keyword pages. Each keyword page lists up to 12 reels.

## `includeTrending` (type: `boolean`):

Also return Instagram's current trending topics, whatever your input.

## Actor input object example

```json
{
  "searchType": "profile",
  "search": [
    "glossier",
    "@gymshark",
    "https://www.instagram.com/reel/DVdIhCREfy_/"
  ],
  "maxPostsPerProfile": 24,
  "maxReelsPerProfile": 0,
  "includeAds": true,
  "maxAdsPerProfile": 20,
  "adsCountry": "US",
  "activeAdsOnly": true,
  "includeComments": false,
  "maxComments": 20,
  "mode": "both",
  "maxKeywords": 25,
  "expandRelated": 0,
  "maxReels": 50,
  "includeTrending": false
}
```

# Actor output Schema

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

Mixed rows discriminated by record\_type: profile, reel (posts and reels), ad, keyword, location, trending\_topic, category.

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

Row counts per record type and the error count.

## `output` (type: `string`):

OUTPUT record with the run's status flags.

## `errors` (type: `string`):

Per-target problems with a code and a redacted message. Absent when the run had none.

# 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 = {
    "search": [
        "glossier"
    ],
    "maxPostsPerProfile": 24,
    "maxReelsPerProfile": 0,
    "maxAdsPerProfile": 20,
    "adsCountry": "US",
    "maxComments": 20,
    "maxKeywords": 25,
    "expandRelated": 0,
    "maxReels": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("s-r/instagram-super-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 = {
    "search": ["glossier"],
    "maxPostsPerProfile": 24,
    "maxReelsPerProfile": 0,
    "maxAdsPerProfile": 20,
    "adsCountry": "US",
    "maxComments": 20,
    "maxKeywords": 25,
    "expandRelated": 0,
    "maxReels": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("s-r/instagram-super-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 '{
  "search": [
    "glossier"
  ],
  "maxPostsPerProfile": 24,
  "maxReelsPerProfile": 0,
  "maxAdsPerProfile": 20,
  "adsCountry": "US",
  "maxComments": 20,
  "maxKeywords": 25,
  "expandRelated": 0,
  "maxReels": 50
}' |
apify call s-r/instagram-super-scraper --silent --output-dataset

```

## MCP server setup

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