# Instagram Highlights Download/Stories Archive Scraper, No Login (`headply/instagram-highlights-scraper`) Actor

Scrape and download Instagram highlights from public profiles without login: photo and video URLs, posting dates, link stickers, hashtags, sponsor tags and paid-partnership labels. Archive mode returns only new stories on scheduled runs and can save the media.

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

## Pricing

from $2.70 / 1,000 highlight items

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 Highlights Scraper & Downloader (No Login)

**Scrape and download Instagram highlights from any public profile, without logging in.** Paste usernames and get
every story saved in their highlights: photo and video download links, the date each story was posted, link stickers
with the real destination URL, hashtags, sponsor tags and Instagram's paid-partnership label. Schedule it to keep an
**Instagram story archive** that only adds what is new, and save the photos and videos before Instagram's links expire.

- ✅ **No Instagram account, no login, no cookies.** Your accounts are never at risk.
- ✅ **Photos and videos** in the highest resolution Instagram serves, with direct download links.
- ✅ **Proof of sponsored stories**: link stickers, sponsor tags and the paid-partnership flag, with posting dates.
- ✅ **Archive mode**: scheduled runs return (and charge for) only new highlight items.
- ✅ **Save media files**: keep copies of the photos and videos in your Apify storage.
- ✅ **Fast and cheap**: about 1,000 highlight items a minute, from $2.70 per 1,000.

### What can you do with Instagram highlights data?

- **Influencer marketing and proof of posting.** Agencies and brands check that a creator's paid story ran: the link
  sticker (with the real URL and UTM tags), the sponsor tag and Instagram's paid-partnership label, with the date it
  was posted. Highlights are where creators keep the stories they want to last.
- **Competitor monitoring.** Brands pin launches, offers, FAQs, reviews and campaigns to their highlights. Run this
  Actor on a schedule and get only what they added since last time.
- **Instagram story archiving.** Download highlight photos and videos in bulk, with dates, titles and links, for
  research, compliance or your own backups.
- **Content and trend research.** Compare what creators and brands highlight across a list of profiles: formats,
  video lengths, hashtags and where their links point.

### How to scrape Instagram highlights

1. Open the Actor and add **Instagram profiles**: usernames like `nasa` or `@nike`, or profile URLs like
   `https://www.instagram.com/redbull/`.
2. Optional: turn on **Only new items** for scheduled archiving, and **Save media files** to keep copies.
3. Click **Start**. Each profile takes a few seconds.
4. Download the results as JSON, CSV, Excel or HTML, or get them through the Apify API.

#### Input example

```json
{
    "profiles": ["nasa", "nba", "https://www.instagram.com/redbull/"],
    "onlyNew": true,
    "monitorName": "competitors",
    "downloadMedia": true
}
```

| Field | What it does |
|---|---|
| **Instagram profiles** | Usernames or profile URLs, one per line. Public profiles only. |
| **Highlights per profile** | 1 to 10. Instagram shows logged-out visitors the first 10 highlights of a profile. |
| **Max items per profile** | Stop after this many story items per profile (0 = no limit). |
| **Only new items (archive mode)** | Return only items not returned before for the same profile and monitor name. The first run returns everything. |
| **Monitor name** | Keeps separate archives, for example one per client. |
| **Save media files** | Copy each photo and video into the run's storage and add the links to the record. |

### Output: what data you get

One record per story in a highlight. This is a real record (links shortened) from NBA's "MEDIA DAY" highlight,
a story Instagram labels as a paid partnership with American Express:

```json
{
    "username": "nba",
    "fullName": "NBA",
    "highlightTitle": "MEDIA DAY",
    "highlightUrl": "https://www.instagram.com/stories/highlights/18115732703087124/",
    "position": 17,
    "itemId": "3996969072692657518",
    "mediaType": "video",
    "takenAt": "2026-09-29T15:30:45.000Z",
    "videoDurationSecs": 51.244,
    "width": 1080,
    "height": 1920,
    "imageUrl": "https://scontent-lga3-3.cdninstagram.com/v/t51.71878-15/828939010_...jpg",
    "videoUrl": "https://scontent-lga3-3.cdninstagram.com/o1/v/t2/f2/m78/AQN7ExyB...mp4",
    "links": [],
    "hashtags": [],
    "sponsors": ["americanexpress"],
    "isPaidPartnership": true,
    "mediaUrlsExpireAt": "2026-10-07T02:52:23.000Z",
    "archivedImageUrl": null,
    "archivedVideoUrl": null
}
```

| Field | Description |
|---|---|
| `username`, `fullName`, `userId` | The profile. |
| `highlightTitle`, `highlightId`, `highlightUrl`, `highlightCoverUrl` | The highlight the story belongs to. |
| `position` | The story's place in the highlight (1 = first). |
| `mediaType`, `imageUrl`, `videoUrl`, `width`, `height`, `videoDurationSecs`, `hasAudio` | The media, in the highest resolution served. Videos also have a cover image. |
| `takenAt` | When the story was originally posted. |
| `links`, `linkStickers` | Link stickers, with the real destination URL (Instagram's redirect removed) and the original Instagram link. |
| `sponsors`, `isPaidPartnership` | Brands tagged as sponsors, and Instagram's paid-partnership label. |
| `hashtags` | Hashtag stickers. |
| `mentions`, `locations`, `music` | Mention, location and music stickers, when Instagram includes them for logged-out visitors (often it does not). |
| `resharedFrom`, `sharedPostShortcode` | The author of a reshared story, and the post a story shares. |
| `mediaUrlsExpireAt` | When Instagram's media links stop working. |
| `archivedImageUrl`, `archivedVideoUrl` | Your saved copies (with **Save media files**). |
| `isNew` | `true` on items returned by only-new mode. |

The dataset has three views: **Highlight items**, **Sponsorship proof** and **Archived media**.

The run's key-value store also has:

- **PROFILES**: one entry per profile with status (ok, private, not found), followers, verified badge, number of
  highlights, and whether the profile has an **active story right now** (`hasActiveStory`, `latestStoryAt`).
- **SUMMARY**: counts, request statistics and anything that could not be loaded.

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

You pay only for results. No start fee and no per-profile fee.

| Event | Free plan | Bronze | Silver | Gold and up |
|---|---|---|---|---|
| Highlight item | $3.50 / 1,000 | $3.20 / 1,000 | $3.00 / 1,000 | $2.70 / 1,000 |
| Media saved (only with **Save media files**) | $4.00 / 1,000 | $3.80 / 1,000 | $3.60 / 1,000 | $3.40 / 1,000 |
| Profile checked with nothing new (only-new mode) | $2.00 / 1,000 | $1.80 / 1,000 | $1.60 / 1,000 | $1.50 / 1,000 |

For example, a profile with 10 highlights usually holds 50 to 200 stories: about $0.18 to $0.70 on the Free plan.
A daily only-new check of 100 quiet profiles costs $0.20. Items skipped as already returned are never charged. Set a
**maximum cost per run** and the Actor stops cleanly when it is reached.

### Schedule an Instagram story archive

1. Save your input as a **task** with **Only new items** on, a **Monitor name**, and, if you want copies of the media,
   **Save media files**.
2. Add a **schedule** (for example daily).
3. The first run returns everything as a baseline. Every later run returns only stories added to the highlights since,
   so you build a complete archive and never pay twice for the same story.

Send the results anywhere with Apify integrations: Google Sheets, Slack, email, Make, Zapier, n8n, webhooks or the API.

### Use it as an Instagram highlights API

Call the Actor from your code and get JSON back:

```bash
curl -X POST "https://api.apify.com/v2/acts/headply~instagram-highlights-scraper/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"profiles": ["nasa"]}'
```

The Apify API clients for JavaScript and Python work the same way, and the Actor also works from AI agents through the
Apify MCP server.

### Limits

- **Highlights only, not today's 24-hour stories.** Instagram does not show active stories to visitors who are not
  logged in, and this Actor never logs in. It tells you *whether* a profile has an active story (`hasActiveStory`),
  but cannot read it. Stories a creator adds to a highlight are captured.
- **First 10 highlights per profile**, which is what Instagram shows logged-out visitors. Most profiles have fewer.
- **Public profiles only.** Private profiles are reported in PROFILES as private and skipped.
- **Instagram's media links expire** after a few days (`mediaUrlsExpireAt`). Use **Save media files** to keep
  copies. Saved copies stay in the run's storage for as long as your Apify plan retains run data; download them if you
  need them longer.

### FAQ

**Do I need an Instagram account or cookies?**
No. The Actor reads what Instagram shows any visitor without logging in. You never share credentials and no account
can be banned.

**Can I download Instagram highlights anonymously?**
Yes. No Instagram account is used, so nothing ties the request to you.

**Can it scrape Instagram stories that are live right now?**
No. Instagram shows active stories only to logged-in users. Use this Actor for highlights, and use `hasActiveStory`
in the PROFILES record to see who has posted a story today.

**Can it scrape private accounts?**
No. Only public profiles.

**How do I download the photos and videos?**
Every record has `imageUrl` and `videoUrl`. They work for a few days. Turn on **Save media files** for copies that do
not depend on Instagram's links.

**How fast is it?**
About 1,000 highlight items a minute with the default settings, and a few seconds per profile.

**Is scraping Instagram highlights legal?**
The Actor collects only public content that Instagram shows to any visitor. It does not log in, does not access
private profiles and does not bypass any login. Results can contain personal data, so make sure you have a legitimate
reason to process it and that your use complies with laws such as the GDPR and with Instagram's terms. If in doubt,
ask a lawyer.

**Something didn't work?**
Open an issue on the Actor's Issues tab with the run link and I'll look at it quickly.

# Actor input Schema

## `profiles` (type: `array`):

Usernames or profile URLs, one per line. For example nasa, @natgeo or https://www.instagram.com/nike/. Public profiles only.

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

How many highlights to read per profile, in the order the profile shows them. Instagram shows logged-out visitors at most the first 10 highlights of a profile, so 10 is the maximum.

## `maxItemsPerProfile` (type: `integer`):

Stop after this many story items per profile. 0 means no limit.

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

Return only highlight items this Actor has not returned before for the same profile and monitor name. The first run returns everything as the baseline. Use it with a schedule to keep a running archive without paying twice for the same item.

## `monitorName` (type: `string`):

Keeps separate only-new memories, for example one per client. Runs with the same name share what has already been returned.

## `downloadMedia` (type: `boolean`):

Copy each item's photo and video into the run's key-value store and add the archived links to the record. Instagram's own media links expire after a few days; the copies stay for as long as your Apify plan keeps run storage (download them to keep them longer). Charged per item archived.

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

How many profiles to work on at once. The default is gentle enough to keep Instagram's rate limits rare.

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

Apify datacenter proxy works well and is the default. Switch to residential only if your runs report many blocked requests.

## `selfTest` (type: `boolean`):

Fail the run if the delivered records are missing fields buyers depend on. For scheduled health checks.

## Actor input object example

```json
{
  "profiles": [
    "nasa",
    "nike"
  ],
  "maxHighlightsPerProfile": 10,
  "maxItemsPerProfile": 0,
  "onlyNew": false,
  "monitorName": "default",
  "downloadMedia": false,
  "maxConcurrency": 4,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyCountry": "US"
  },
  "selfTest": false
}
```

# Actor output Schema

## `items` (type: `string`):

No description

## `profiles` (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 = {
    "profiles": [
        "nasa",
        "nike"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("headply/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 = { "profiles": [
        "nasa",
        "nike",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("headply/instagram-highlights-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 '{
  "profiles": [
    "nasa",
    "nike"
  ]
}' |
apify call headply/instagram-highlights-scraper --silent --output-dataset

```

## MCP server setup

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