# Instagram Highlights Scraper \[Only $2💰] | Stories | No Login (`ahmed_jasarevic/instagram-highlights-guest-scraper`) Actor

Extract public Instagram highlights and every story item inside them with no login: media URLs, captions, hashtags, mentions, music and covers. Export clean JSON at $2 per 1,000 story items.

- **URL**: https://apify.com/ahmed_jasarevic/instagram-highlights-guest-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.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 Highlights Scraper (No Login)

Extract public Instagram highlights and every story item inside them without login: highlight titles and covers, image and video media URLs, thumbnails, dimensions, duration, captions, hashtags, @mentions, links, music metadata and timestamps. It runs on a guest web session (no cookies, no account) at **$2.00 per 1,000 story items**, with an optional archive that can serve expired highlights later.

### Main Use Cases

- **Instagram highlights monitoring** - track the highlight reels of any public profile over time.
- **Competitor content research** - collect what competitors save into highlights and how often they rotate it.
- **Influencer research** - build a dataset of a creator's highlight media, captions and covers.
- **Brand monitoring** - watch highlight items that mention a brand, hashtag or account.
- **Instagram story archiving** - persist captured items to a reusable archive and serve them when they expire.
- **Creative and content research** - download image and video media URLs for editing or analysis.

### How It Works - Build An Instagram Highlights Dataset Without Login

Instagram renders public profile and highlight pages on the server (SSR) for guests, and exposes the highlight tray as JSON inside the page. The Actor:

1. Boots a guest web session against `instagram.com` (using the public web `APP_ID` and the storefront-style `x-ig-app-id` / browser headers) to obtain a guest `csrftoken`.
2. Lists a profile's highlights from the SSR HTML of `/{username}/`, reading the `lox_highlights_connection` payload, or uses `highlightIds` directly when you pass them.
3. Expands each highlight into its story items with the guest feed endpoint `/api/v1/feed/reels_media/?reel_ids=highlight%3A{highlightId}`, with a stories-HTML harvest fallback when the feed is not returned.
4. Optionally writes captured items to a reusable key-value archive (store `ighighlights-archive`, key `hl-<highlightId>`), and can merge archived items back in when `includeHistorical` is on (each merged row is tagged `archived: true`).

Instagram blocks anonymous datacenter requests, so `proxyConfiguration` defaults to Apify Unblocker (residential). If direct guest mode cannot be reached, the Actor falls back to the guest cookie session; no login or account password is ever used.

### Input Parameters

| Field | Type | Required | Default | Notes |
| --- | --- | --- | --- | --- |
| `usernames` | array (string) | No | `["instagram"]` prefill | Public profiles whose highlights should be scraped. Accepts handles, @handles or full profile URLs. Leave empty if you only pass `highlightIds`. |
| `highlightIds` | array (string) | No | - | Direct highlight IDs or highlight URLs whose story items should be scraped without listing a profile first. |
| `expandHighlightItems` | boolean | No | `true` | Every highlight is expanded into individual story items (one row per story). When `false`, only one summary row per highlight is saved. |
| `maxHighlightsPerUser` | integer | No | `10` (1-25) | Maximum number of highlights to process per username. |
| `maxStoriesPerHighlight` | integer | No | `200` (1-2000) | Upper bound on story items saved per expanded highlight. |
| `maxTotalItems` | integer | No | `200` (1-2000) | Maximum total number of story-item rows saved across the entire run. |
| `includeRawData` | boolean | No | `false` | When true each row also carries the unmodified item under a `raw` key. |
| `archiveEnabled` | boolean | No | `true` | Persist captured story items to a reusable key-value store for later reuse. |
| `includeHistorical` | boolean | No | `false` | Merge previously captured items that are no longer present live (tagged `archived: true`). |
| `proxyConfiguration` | object | No | Apify Unblocker | Only used in direct mode (no provider key). Defaults to Apify Unblocker, which is required because Instagram blocks anonymous requests. |

Note: default values shown here follow the Actor's input schema, which is authoritative over any code defaults.

### Output Fields

One row per story item (when `expandHighlightItems` is true; otherwise one summary row per highlight). Fields:

- Highlight context: `highlightId`, `highlightTitle`, `highlightCoverUrl`, `position`, `storyIndex`.
- Story identity: `storyId`, `storyCode`, `permalink`, `source` (`highlight` or `archive`), `provider`.
- Owner: `username`, `ownerId`, `ownerUsername`.
- Media: `mediaType` (`image` or `video`), `storyType` (`image` or `video`), `mediaUrl` (best available), `imageUrl`, `videoUrl`, `thumbnailUrl`, `width`, `height`, `duration`, `hasAudio`.
- Content: `caption`, `hashtags` (array), `mentions` (array), `links` (array), `musicTitle`, `musicArtist`.
- Timing: `takenAt`, `expiringAt`, `expiresAt`, `scrapedAt`.
- Archive: `archived` (boolean), `archivedFrom` (the live source a merged row came from).

The `overview` view shows `username`, `highlightTitle`, `storyType`, `mediaUrl`, `takenAt` and `caption`.

### Example Input And Output

Example input (a few public profiles, most recent 10 highlights each):

```json
{
  "usernames": ["instagram", "natgeo"],
  "expandHighlightItems": true,
  "maxHighlightsPerUser": 10,
  "maxStoriesPerHighlight": 200,
  "maxTotalItems": 200
}
```

Example input (direct highlight IDs, with archived items merged in):

```json
{
  "highlightIds": ["17900000000000000"],
  "expandHighlightItems": true,
  "archiveEnabled": true,
  "includeHistorical": true
}
```

Example output row:

```json
{
  "storyId": "3345678901234567890_25025320",
  "storyCode": "C8xYzAbC123",
  "username": "natgeo",
  "ownerId": "25025320",
  "ownerUsername": "natgeo",
  "highlightId": "17900000000000000",
  "highlightTitle": "Wildlife",
  "highlightCoverUrl": "https://scontent.cdninstagram.com/v/t51.2885-15/cover.jpg",
  "position": 3,
  "storyIndex": 1,
  "mediaType": "video",
  "storyType": "video",
  "mediaUrl": "https://scontent.cdninstagram.com/v/t50.2886-16/story.mp4",
  "videoUrl": "https://scontent.cdninstagram.com/v/t50.2886-16/story.mp4",
  "thumbnailUrl": "https://scontent.cdninstagram.com/v/t51.2885-15/thumb.jpg",
  "width": 1080,
  "height": 1920,
  "duration": 12.4,
  "hasAudio": true,
  "caption": "A young elephant crossing the river #wildlife",
  "hashtags": ["wildlife"],
  "mentions": ["natgeowild"],
  "links": [],
  "musicTitle": "Original audio",
  "musicArtist": "natgeo",
  "takenAt": "2024-06-01T18:30:00.000Z",
  "expiringAt": null,
  "expiresAt": null,
  "permalink": "https://www.instagram.com/stories/highlights/17900000000000000/",
  "source": "highlight",
  "provider": "guest",
  "archived": false,
  "archivedFrom": null,
  "scrapedAt": "2026-10-11T09:30:00.000Z"
}
```

### Integrations & Automation

- **Apify API** - run via `POST https://api.apify.com/v2/acts/{actorId}/runs`, export via `GET /v2/datasets/{datasetId}/items?clean=true&format=json`.
- **Schedules** - run daily or weekly to keep a highlight archive current; combined with `includeHistorical` this gives you items Instagram has already dropped from the live tray (recurring usage also improves Store recommendation signals).
- **Webhooks** - fire on run finished to push new highlight items into your own storage.
- **Zapier / Make** - via the Apify integration, e.g. new highlight media into Google Drive or Airtable.
- **Pay-per-event** - $2.00 per 1,000 story items (`result`), plus a $0.00005 run start.

### Related Actors

- [instagram-highlights-scraper](https://apify.com/seemuapps/instagram-highlights-scraper): the most-used Instagram highlights actor on the Store.
- [instagram-stories-highlights-scraper](https://apify.com/memo23/instagram-stories-highlights-scraper): a popular stories plus highlights actor with optional media download.
- [instagram-story-details-scraper](https://apify.com/louisdeconinck/instagram-story-details-scraper): a large no-login Instagram stories actor.
- [advanced-instagram-stories-scraper](https://apify.com/datavoyantlab/advanced-instagram-stories-scraper): a fast public stories scraper with media URLs.
- [instagram-stories-highlights-scraper](https://apify.com/goat255/instagram-stories-highlights-scraper): stories and highlight reels with inner items from any public profile.

### FAQ

#### Does Instagram offer an API for highlights?

Instagram's public Graph API does not expose other accounts' highlights, and the legacy endpoints require an authenticated app. This Actor instead reads the guest-rendered SSR HTML and the public `reels_media` feed, with no login, no app review and no cookie.

#### Can I scrape Instagram highlights without login or cookies?

Yes. The Actor boots a guest session against instagram.com to obtain a temporary guest token and reads only public pages. No account, password or user cookie is used. A residential proxy (Apify Unblocker, the default) is required because Instagram blocks anonymous datacenter requests.

#### What are the alternatives to this Instagram highlights scraper?

Store alternatives include seemuapps/instagram-highlights-scraper ($0.015 per result), goat255/instagram-stories-highlights-scraper ($0.0033 per story), memo23/instagram-stories-highlights-scraper (account plus highlight tray events), datavoyantlab/advanced-instagram-stories-scraper (stories only) and data-slayer/instagram-highlights-scraper ($0.00217 per result). This actor returns one row per highlight story item at $2.00 per 1,000 results and can archive items for later.

#### How do I download all stories inside a highlight?

Leave `expandHighlightItems` at its default `true`. Each highlight is expanded into one row per story item, each with its `mediaUrl`, `imageUrl` or `videoUrl`. Set `maxStoriesPerHighlight` and `maxTotalItems` to bound the run.

#### Can I monitor a competitor's highlights over time?

Yes. Schedule a run with `archiveEnabled: true`. Captured items are written to a reusable archive; later, `includeHistorical: true` merges archived items that are no longer live, tagged `archived: true`.

#### Do I get both image and video media URLs?

Yes. Video stories carry `videoUrl`, image stories carry `imageUrl`, and every row also has `mediaUrl` (the best available) plus `thumbnailUrl`, `width`, `height`, `duration` and `hasAudio`.

#### How much does it cost?

$2.00 per 1,000 story items (`result`), plus a $0.00005 run start. Proxy traffic is billed separately by Apify when using Unblocker or residential proxies.

### SEO Keywords

instagram highlights scraper, instagram highlights api, instagram highlights without login, instagram highlights no cookies, instagram story highlights download, instagram highlights monitoring, instagram media urls, instagram highlights json, instagram highlights scraper api, instagram story archive, instagram highlight covers, instagram stories and highlights, competitor content research, influencer research, brand monitoring, instagram reel music metadata, instagram highlight media download, instagram highlights csv, instagram story viewer, instagram highlights data

### For AI Agents & LLM Apps

- **Purpose**: returns one JSON row per Instagram highlight story item (highlight context, media URLs, caption, hashtags, mentions, links, music, timestamps) for any public profile, without login.
- **Minimal working input**:

```json
{ "usernames": ["instagram"], "maxTotalItems": 10 }
```

- **Variant input** (direct highlight IDs with the archive merged in):

```json
{ "highlightIds": ["17900000000000000"], "includeHistorical": true }
```

- **Output field names**: `storyId, storyCode, username, ownerId, ownerUsername, highlightId, highlightTitle, highlightCoverUrl, position, storyIndex, mediaType, storyType, mediaUrl, thumbnailUrl, imageUrl, videoUrl, width, height, duration, hasAudio, caption, hashtags, mentions, links, musicTitle, musicArtist, takenAt, expiringAt, expiresAt, permalink, source, provider, archived, archivedFrom, scrapedAt`.
- **Behaviors an agent should know**:
  - Input priority: pass `usernames` to list highlights, or `highlightIds` to go straight to items; you can combine them. `usernames` accepts handles, @handles or full profile URLs.
  - `expandHighlightItems: false` returns a single summary row per highlight instead of one row per story, which is much cheaper.
  - `maxTotalItems` (default 200) is a global cap across the whole run; `maxHighlightsPerUser` (default 10) and `maxStoriesPerHighlight` (default 200) bound per-user work. The input schema defaults are authoritative over any code defaults.
  - `includeHistorical: true` only has archived data to merge if a previous run wrote to the archive with `archiveEnabled: true`; merged rows carry `archived: true` and an `archivedFrom` value.
  - `proxyConfiguration` is used only in direct guest mode and defaults to Apify Unblocker; without a residential proxy Instagram blocks the request.
  - `includeRawData: true` adds the raw upstream item under a `raw` key and makes rows larger.
- **Billing**: pay-per-event - $0.002 per story-item row (`result`), $0.00005 per run start. Tiered pricing may be lower on higher Apify plans. Proxy traffic is billed separately.

### Legal & Compliance Disclaimer

This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Meta Platforms, Inc. or Instagram. It accesses only publicly available profile and highlight pages through a guest session; it does not log in, does not use an account password and does not use a user's cookies.

Users are responsible for complying with Instagram's terms of service and applicable data-protection law (for example GDPR or CCPA). Highlight items can include personal content such as usernames, captions, @mentions and links; do not use extracted personal data for unsolicited commercial outreach in violation of applicable law, and respect copyright in any downloaded media. Use the data for lawful purposes such as research, brand monitoring and content analysis.

# Actor input Schema

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

Public profiles whose highlights should be scraped. Accepts handles, @handles, or full profile URLs. Leave empty if you only pass highlightIds.

## `highlightIds` (type: `array`):

Direct highlight IDs or URLs whose story items should be scraped without listing a profile first.

## `expandHighlightItems` (type: `boolean`):

Defaults to true: every highlight is expanded into individual story items (one row per story). When false, only one summary row per highlight is saved.

## `maxHighlightsPerUser` (type: `integer`):

Maximum number of highlights to process per username (1-25). Default 10, matching the reference actor.

## `maxStoriesPerHighlight` (type: `integer`):

Upper bound on story items saved per expanded highlight (1-2000). Default 200 in the original pattern; we keep reasonable cap.

## `maxTotalItems` (type: `integer`):

Maximum total number of story-item rows saved across the entire run (1-2000). Default 200.

## `includeRawData` (type: `boolean`):

When true each row also carries the unmodified item under a 'raw' key.

## `archiveEnabled` (type: `boolean`):

Persist captured story items to a reusable key-value store for later reuse.

## `includeHistorical` (type: `boolean`):

Merge previously captured items that are no longer present live (tagged archived:true).

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

Only used in direct mode (no provider key). Defaults to Apify Unblocker, which is required because Instagram blocks anonymous requests.

## Actor input object example

```json
{
  "usernames": [
    "instagram"
  ],
  "expandHighlightItems": true,
  "maxHighlightsPerUser": 10,
  "maxStoriesPerHighlight": 200,
  "maxTotalItems": 200,
  "includeRawData": false,
  "archiveEnabled": true,
  "includeHistorical": false
}
```

# Actor output Schema

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

Default dataset items: highlight context (highlightId, highlightTitle, highlightCoverUrl), story identity (storyId, storyCode, permalink, source, provider), owner (username, ownerId, ownerUsername), media (mediaType, storyType, mediaUrl, imageUrl, videoUrl, thumbnailUrl, width, height, duration, hasAudio), content (caption, hashtags, mentions, links, musicTitle, musicArtist), timing (takenAt, expiringAt, expiresAt, scrapedAt) and archive flags (archived, archivedFrom).

## `overviewView` (type: `string`):

The same dataset rendered with the 'overview' view: username, highlightTitle, storyType, mediaUrl, takenAt and caption.

# 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": [
        "instagram"
    ]
};

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

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

```

## MCP server setup

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