# Instagram Highlights Scraper With Profile Analytics (`simpleapi/instagram-highlights-scraper`) Actor

Instagram Highlights Scraper collects data from Instagram Highlights, capturing highlight titles, story URLs, timestamps, media types, and metadata. Ideal for analytics, content archiving, monitoring brand activity, or automating Instagram research with clean, structured output

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

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### Instagram Highlights Scraper — Covers, Titles and Profile Leaderboard

Instagram Highlights Scraper With Profile Analytics extracts every Story Highlight from one or more Instagram profiles — title, ID, and a genuinely full-resolution cover image — then rolls each profile's highlights into a free analytics summary and ranks every processed profile on a cross-profile leaderboard by highlight volume. It's built for brand and creator research, agency audits comparing multiple accounts, and anyone who needs a permanent archive of highlight covers before Instagram's CDN links expire.

### What is Instagram Highlights Scraper With Profile Analytics?

Instagram Highlights Scraper With Profile Analytics is an Apify Actor that scrapes the Story Highlights tray for one or more public Instagram profiles, with automatic proxy fallback on blocks. No Instagram login is required. Key capabilities:

- Scrape highlights for one or many profiles per run, by URL, username, or highlight shortcode
- Fully cursor-paginated tray fetching, so large accounts don't lose highlights past the first page
- Resolve each highlight's genuinely full-resolution cover image and archive a permanent copy to the run's Key-Value Store, so it survives after Instagram's CDN link expires
- Get a free, uncharged per-profile analytics summary — total highlight count, full title list, first/last highlight ID, and success rate
- Get a free, uncharged cross-profile leaderboard ranking every processed profile by highlight count
- Automatic proxy escalation (direct → datacenter → residential) on repeated blocks

### What data can I extract with Instagram Highlights Scraper With Profile Analytics?

| Field | Example Value | Use Case |
| --- | --- | --- |
| `username` / `user_id` | `"nike"` / `"13460080"` | Identify the profile the highlight belongs to |
| `id` / `title` | `"17912345678"` / `"New Drops"` | Identify and label the individual highlight |
| `cover_media` | Instagram CDN thumbnail URL | The tray-size cover as Instagram serves it |
| `cover_media_full_res` | Instagram CDN full-size URL | The genuinely highest-resolution cover found |
| `cover_media_expires_at` | `"2026-07-27T02:00:00Z"` | Know when the CDN link itself will stop working |
| `cover_media_archive_url` | Apify Key-Value Store URL | A permanent copy that survives CDN expiry |
| `success` / `error` | `true` / `null` | Confirm whether this highlight resolved cleanly |
| `profile_highlight_count` / `profile_titles` | `12` / `["New Drops", "Team", "Events", ...]` | Per-profile roll-up (summary rows only) |
| `profile_first_highlight_id` / `profile_last_highlight_id` | `"17900001"` / `"17912345678"` | Bookend IDs for this profile's highlight set |
| `profile_success_rate` | `100.0` | Percentage of this profile's highlights that resolved successfully |
| `leaderboard_rank` | `1` | This profile's rank by highlight count across the whole run |
| `timestamp` | `"2026-07-26T14:02:11Z"` | Record when the row was collected |

#### Genuinely full-resolution cover archiving

`cover_media_full_res` is not a bigger thumbnail guess — the Actor calls Instagram's `reels_media` endpoint, matches the returned images back to the tray's thumbnail by CDN asset ID, and picks the true highest-resolution candidate by `max(width × height)`. When `archiveCoverImages` is on (default), that full-resolution image is downloaded and saved permanently to the run's Key-Value Store as `cover_media_archive_url`, since Instagram's own CDN links carry an expiring `oe=` timestamp and will eventually stop resolving.

#### Free per-profile summary and cross-profile leaderboard

When `enableProfileSummary` is on (default), one extra row per profile (`isSummary: true`) rolls up `profile_highlight_count`, the full `profile_titles` list, the first/last highlight IDs, and `profile_success_rate` — all computed from the highlight rows already collected for that profile, at no extra request cost. When `enableLeaderboard` is on (default), one row per profile (`isLeaderboard: true`) ranks every processed profile by highlight count, highest first, for quick batch comparison. **Both row types are pushed uncharged** — only individual highlight rows are billed. Filter on `!isSummary && !isLeaderboard` if you want only the charged rows.

### Why not build this yourself?

Instagram's Graph API only exposes a Business/Creator account's own Story Highlights to that account's own access token — there is no endpoint for pulling another profile's highlight tray. Building an equivalent tool yourself means reproducing Instagram's cursor-paginated highlight-tray fetching, resolving genuinely full-resolution covers by matching CDN asset IDs across two different endpoints, and archiving them before the CDN link expires. All of that is already implemented in this Actor's source.

### How to use data extracted from Instagram?

#### Brand and creator research

Scrape a creator or brand's `targetProfiles` to build a visual archive of their highlight covers and titles before an outreach conversation, using `profile_titles` to quickly understand how they organize their Story content categories (e.g. "FAQ," "Reviews," "New Drops").

#### Agencies auditing multiple accounts

Run a full client or competitor list through `targetProfiles` in one batch and use `leaderboard_rank`/`profile_highlight_count` to see at a glance which accounts invest most heavily in curated Highlight content.

#### Market and content research

Compare `profile_titles` across a category's leading accounts to identify common Highlight organization patterns (e.g. most fashion brands running a "Size Guide" highlight) worth adopting.

#### AI agents and automated pipelines

An agent can call this Actor to pre-fetch a profile's highlight structure before generating a content-strategy recommendation, using `profile_highlight_count` and `profile_titles` as structured input.

### 🔼 Input sample

| Parameter | Required | Type | Description | Example Value |
| --- | --- | --- | --- | --- |
| `targetProfiles` | No | array | Profile URLs, usernames, or highlight shortcodes | `["https://www.instagram.com/nike/"]` |
| `maxHighlightsPerProfile` | No | integer (min 0) | Cap on highlights fetched per profile across all pages; `0` = unlimited | `0` (default) |
| `archiveCoverImages` | No | boolean | Archive full-resolution covers to the Key-Value Store | `true` (default) |
| `proxySettings` | No | object | Proxy usage; auto-escalates on 429/403 blocks | `{"useApifyProxy": true}` |
| `enableProfileSummary` | No | boolean | Push a free per-profile analytics summary row | `true` (default) |
| `enableLeaderboard` | No | boolean | Push a free cross-profile leaderboard | `true` (default) |

```json
{
  "targetProfiles": ["https://www.instagram.com/nike/", "https://www.instagram.com/adidas/"],
  "maxHighlightsPerProfile": 0,
  "archiveCoverImages": true
}
```

**Common pitfall:** `maxHighlightsPerProfile: 0` means unlimited, but pagination has an internal safety cap on the number of GraphQL pages fetched per profile regardless of the limit set — extremely large highlight trays may stop short of "every" highlight on very high-volume accounts.

### 🔽 Output sample

Output is typed, normalized JSON with three row types: individual highlight rows (charged), plus free per-profile summary and leaderboard rows (exportable as JSON, CSV, or Excel).

```json
{
  "input_url": "https://www.instagram.com/nike/",
  "username": "nike",
  "user_id": "13460080",
  "type": "highlight",
  "id": "17912345678",
  "title": "New Drops",
  "cover_media": "https://scontent.cdninstagram.com/...thumbnail",
  "cover_media_full_res": "https://scontent.cdninstagram.com/...fullres",
  "cover_media_expires_at": "2026-07-27T02:00:00Z",
  "cover_media_archive_url": "https://api.apify.com/v2/key-value-stores/.../records/cover_17912345678",
  "success": true,
  "error": null,
  "timestamp": "2026-07-26T14:02:11Z"
}
```

Profile summary rows (`isSummary: true`) additionally carry `profile_highlight_count`, `profile_titles`, `profile_first_highlight_id`, `profile_last_highlight_id`, and `profile_success_rate`. Leaderboard rows (`isLeaderboard: true`) carry `leaderboard_rank`. All 21 fields shown across these row types are the Actor's real dataset columns.

### How do you filter and target specific highlights?

`targetProfiles` accepts URLs, usernames, or highlight shortcodes, so scope is set by exactly which profiles you list — this is a direct-lookup tool rather than a discovery search. The one real volume control is `maxHighlightsPerProfile` (0 = unlimited, subject to the internal page-safety cap); the analytics toggles `enableProfileSummary` and `enableLeaderboard` don't filter content but do control which free roll-up rows accompany the individual highlight rows in your dataset.

```json
{ "targetProfiles": ["nike", "adidas", "puma"], "enableLeaderboard": true, "enableProfileSummary": true }
```

```json
{ "targetProfiles": ["https://www.instagram.com/mrbeast/"], "maxHighlightsPerProfile": 20, "archiveCoverImages": true }
```

```json
{ "targetProfiles": ["nike"], "enableProfileSummary": false, "enableLeaderboard": false }
```

### ▶️ Want to try other Instagram scrapers?

| Scraper Name | What it extracts |
| --- | --- |
| Instagram Profile Scraper & Account Privacy Checker | Full profile details plus privacy-status checking |
| Instagram Reels Scraper With Engagement Analytics | Reel-specific engagement analytics |
| Instagram Followers Count Scraper | Follower/following/post counts and bio data |
| Instagram Related Person Scraper With Profile Enrichment | Related/lookalike networks for a given account |
| Facebook Photos Scraper & High-Res Photo Export | Comparable full-resolution image extraction for Facebook |
| Pinterest Search + Pin Engagement Scraper | Comparable visual-content and engagement data for Pinterest |

### How to extract Instagram data programmatically

Every run is a standard Apify Actor call — one API request with your token, JSON input, JSON results back.

#### Python example

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_API_TOKEN>")

run_input = {
    "targetProfiles": ["https://www.instagram.com/nike/"],
    "archiveCoverImages": True,
}

run = client.actor("<YOUR_USERNAME>/instagram-highlights-scraper-with-profile-analytics").call(run_input=run_input)

for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    if not row.get("isSummary") and not row.get("isLeaderboard"):
        print(row["title"], row["cover_media_full_res"])
```

#### Export to spreadsheets or CRM

Export the dataset directly as CSV or Excel, then map `username`/`title` to your content-library columns and `cover_media_archive_url` to a permanent asset-reference field.

### Is it legal to scrape Instagram highlights?

Highlight titles and cover images are attached to public profiles and don't carry individual commenter or follower identities, so this is closer to public brand/creator content than personal data in most business contexts — but a creator's own personal Highlights (e.g. featuring family or private life) may still carry personal-data considerations under GDPR/CCPA depending on content. Public Instagram highlight trays are visible to any logged-out visitor. Consult legal counsel for commercial applications involving bulk storage of creator content.

### ❓ FAQ

#### How is the highlight cover actually "full resolution"?

The Actor calls Instagram's `reels_media` endpoint separately from the tray fetch, matches the returned images to the tray thumbnail by CDN asset ID, and selects the genuine highest-resolution candidate by computed pixel area — it's not a guessed larger URL pattern.

#### Does the profile summary or leaderboard row cost extra?

No — both are pushed uncharged. Only individual highlight rows are billed under the `row_result` event. Filter on `!isSummary && !isLeaderboard` to isolate only the charged rows.

#### How many highlights can I get per profile?

`maxHighlightsPerProfile` (default 0 = unlimited) caps this, though an internal safety cap on GraphQL pages fetched per profile applies regardless, to protect against runaway pagination on unusually large accounts.

#### Do I need an Instagram account to use this?

No — the highlight tray is fetched from Instagram's public profile surface with no login required.

#### Will the archived cover image still work after Instagram's link expires?

Yes — that's the purpose of `cover_media_archive_url`: it's a permanent copy in the run's own Key-Value Store, independent of Instagram's expiring CDN `oe=` timestamp on `cover_media`/`cover_media_full_res`.

#### Does Instagram Highlights Scraper With Profile Analytics work with Claude, ChatGPT, and AI agent frameworks?

It has no dedicated MCP server registration in this Actor's current setup, but it is callable as a standard Apify API endpoint by any agent framework that can make an authenticated HTTP request and parse JSON.

#### How does this compare to other Instagram highlights scrapers?

No independently verifiable competitor listing could be confirmed at the time of writing, so no specific comparison is made here. This Actor's distinguishing feature is genuine full-resolution cover resolution plus free per-profile and cross-profile analytics rows.

#### What does profile\_success\_rate actually measure?

The percentage of that profile's highlights that resolved successfully (`success: true`) out of the total attempted — a data-quality signal for that specific profile's run, not a claim about the Actor's overall reliability.

### Conclusion

Instagram Highlights Scraper With Profile Analytics turns a profile list into a full highlight archive — genuinely full-resolution covers, permanent Key-Value Store archiving, and free per-profile and cross-profile analytics computed at no extra request cost. It's built for brand researchers, agencies, and content strategists who need more than a raw highlight dump. Start a run with your target profiles to get highlights, summaries, and a leaderboard back in one pass.

# Actor input Schema

## `targetProfiles` (type: `array`):

🔗 Add one or more targets — each line is one profile. Accepted: full profile URL (https://www.instagram.com/username), username (username or @username), or highlight shortcode (ABC123DEF45). Each profile's highlights are scraped and rolled up into a per-profile analytics summary + a final cross-profile leaderboard. Also accepts the base actor's 'startUrls' key as a fallback.

## `maxHighlightsPerProfile` (type: `integer`):

Cap on how many highlights to fetch per profile, across ALL pages of the tray. 0 = unlimited (fetch every page until Instagram reports no more highlights).

## `archiveCoverImages` (type: `boolean`):

When enabled, the actor resolves each highlight's genuinely full-resolution cover photo (via Instagram's reels\_media endpoint, matched to the tray thumbnail by CDN asset ID) and downloads a permanent copy into this run's Key-Value Store, so the cover survives after Instagram's CDN link (`oe=` timestamp) expires.

## `proxySettings` (type: `object`):

Choose which proxies to use. Strategy: start with your selection (e.g. no proxy or Apify proxy). On HTTP 429 or 403 (platform block), the actor fails fast and falls back: first to datacenter, then to residential (sticky for the rest of the run). Also accepts the base actor's 'proxyConfiguration' key as a fallback.

## `enableProfileSummary` (type: `boolean`):

When ON (default), the actor pushes one extra, uncharged summary row per profile: total highlight count, the full highlight title list, first/last highlight ID, and the profile's success rate — so you get profile-level analytics without manually aggregating the per-highlight rows.

## `enableLeaderboard` (type: `boolean`):

When ON (default), after every profile in the run finishes, the actor pushes one uncharged leaderboard row per profile — ranked highest-to-lowest by highlight count — for batch competitor/influencer comparison across the whole target list.

## Actor input object example

```json
{
  "targetProfiles": [
    "https://www.instagram.com/mrbeast/",
    "https://www.instagram.com/nike/"
  ],
  "maxHighlightsPerProfile": 0,
  "archiveCoverImages": true,
  "proxySettings": {
    "useApifyProxy": true
  },
  "enableProfileSummary": true,
  "enableLeaderboard": true
}
```

# 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 = {
    "targetProfiles": [
        "https://www.instagram.com/mrbeast/",
        "https://www.instagram.com/nike/"
    ],
    "proxySettings": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("simpleapi/instagram-highlights-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 = {
    "targetProfiles": [
        "https://www.instagram.com/mrbeast/",
        "https://www.instagram.com/nike/",
    ],
    "proxySettings": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("simpleapi/instagram-highlights-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "targetProfiles": [
    "https://www.instagram.com/mrbeast/",
    "https://www.instagram.com/nike/"
  ],
  "proxySettings": {
    "useApifyProxy": true
  }
}' |
apify call simpleapi/instagram-highlights-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=simpleapi/instagram-highlights-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/MikKapHG8ElnyPXcU/builds/MhbMtG2a1AqWEmxGR/openapi.json
