# Instagram Highlights Scraper (`parseforge/instagram-highlights-scraper`) Actor

Scrape Instagram story highlights from public profiles: title, cover, frame count and every photo and video with URLs, dates, duration, mentions, links. Export CSV, Excel, JSON, XML.

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

## Pricing

from $3.40 / 1,000 result 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

![ParseForge Banner](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner-v4.webp)

## 🎞 Instagram Highlights Scraper

> 🚀 **Export Instagram story highlights in seconds.** One row per highlight with 25 fields, and every photo and video inside it with 16 fields each: direct image and MP4 links, the original post date, video length, mentions, link stickers, hashtags and locations. No Instagram account needed.

Instagram Highlights Scraper reads the story highlights that public Instagram accounts keep pinned on their profile. Give it usernames or profile links and it returns each highlight's title, cover, frame count and creation date, plus the complete list of frames inside it. Give it highlight links or IDs and it reads exactly those highlights.

In our test run, 10 highlights from @nasa and @instagram came back with 286 frames (199 videos, 87 photos), 25 link stickers pointing at the real destination URL, and 201 frames with account mentions. Every frame keeps the moment it was first posted as a story, so a highlight created today can still show frames from two years ago.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Social media managers, influencer marketing agencies, brand and competitor analysts, e-commerce teams, researchers, content archivists | Competitor highlight audits, influencer vetting, link-in-story tracking, campaign archiving, content research, media downloads |

### 📋 What the Instagram Highlights Scraper does

- 👤 **Profiles in, highlights out.** Username, @handle or profile link. The Actor reads the profile's highlights tray in the order Instagram shows it (pinned and newest first).
- 🎞 **Every frame.** Each highlight row nests all of its photos and videos: full-size image URL, MP4 URL, width and height, duration in seconds, audio flag and the original post time.
- 🔗 **Link stickers, unwrapped.** Instagram wraps story links in its own redirect. The Actor returns the real destination (`https://go.nasa.gov/adoptapixel`, not `l.instagram.com/?u=...`) plus the text shown on the sticker.
- 🏷 **Mentions, hashtags and locations.** Tagged accounts, hashtag stickers and location stickers with name, address and coordinates.
- 🔢 **Summary columns.** Photo count, video count, total video seconds, link count, distinct mentioned accounts, oldest and newest frame date, so you can compare highlights without opening the nested list.
- 🎯 **Direct highlight links.** `instagram.com/stories/highlights/<id>/` links or bare IDs are read without the profile.

> 💡 **Why it matters:** highlights are the one part of a profile that brands curate on purpose. Menus, launches, FAQs, reviews, promo codes and partner links live there for months, long after the 24-hour story has expired.

### 🎬 Full Demo (🚧 Coming soon)

### 📊 Output

Each row is one highlight. Its frames are nested in `items`. Open the **Frames** view (or add `unwind=items` to the dataset API link) to get one row per photo or video instead.

| Field | Description |
|---|---|
| 🖼 imageUrl | Highlight cover image |
| 🆔 highlightId | Instagram highlight ID |
| 📌 title | Highlight title |
| 🔗 highlightUrl | Public link to the highlight |
| 👤 username / 🔗 profileUrl | Owner account, same fields as the ParseForge Instagram profile actors |
| 🆔 ownerId / 🪪 ownerFullName / ✔️ ownerIsVerified | Owner ID, display name and verified badge |
| 🔢 itemCount / 📥 itemsReturned | Frames in the highlight, and frames included in the row |
| 📷 imageCount / 🎬 videoCount / ⏱ totalVideoSeconds | Photo and video split, and total video length |
| 🔗 linkCount / 🏷 mentionCount | Link stickers and distinct mentioned accounts |
| 📅 firstItemAt / lastItemAt / createdAt | Oldest frame, newest frame, and when the highlight was created |
| 📌 isPinned / 🔢 trayPosition / 🧭 source | Pinned flag, position in the profile tray (0 when requested by link), and how the highlight was found |
| 🎞 items | Every frame: imageUrl, id, mediaType, videoUrl, takenAt, takenAtTimestamp, durationSeconds, hasAudio, width, height, mentions, hashtags, links, locations, isPaidPartnership, productType |
| 🕒 scrapedAt | When the row was collected |
| ❌ error | Error message on error rows, null on data rows |

Three real rows from a run on @nasa and @instagram. Each `items` list is cut to one frame here to keep the page short; the real rows carry every frame.

```json
[
  {
    "imageUrl": "https://scontent-lim1-1.cdninstagram.com/v/t51.71878-15/785745361_1537318174532484_931463605431094788_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_ht=scontent-lim1-1.cdninstagram.com&_nc_cat=100&_nc_oc=Q6cZ2gHtaj_N7DK8XOLXA_Y-6sWVTBxHRkAt4DXfVB31_axoepT1bmwd8vD78pROe6zdm4Fgk44n20ZLOPeEDeLYdX5F&_nc_ohc=5LPCHdaO_goQ7kNvwHcp2ci&_nc_gid=uqQwEYPLuDth6iW4QLILVg&edm=ANmP7GQBAAAA&ccb=7-5&oh=00_AQPTLSGU3s-LmRlacRuqOB2dO8_9yVUBnr6XNjamCZ6KHg&oe=6AC0DBFB&_nc_sid=982cc7",
    "highlightId": "18195781759377100",
    "title": "Roman",
    "highlightUrl": "https://www.instagram.com/stories/highlights/18195781759377100/",
    "username": "nasa",
    "profileUrl": "https://www.instagram.com/nasa/",
    "ownerId": "528817151",
    "ownerFullName": "NASA",
    "ownerIsVerified": "Yes",
    "itemCount": 9,
    "itemsReturned": 9,
    "imageCount": 0,
    "videoCount": 9,
    "totalVideoSeconds": 279.687,
    "linkCount": 1,
    "mentionCount": 1,
    "firstItemAt": "2026-08-30T11:00:53.000Z",
    "lastItemAt": "2026-08-30T13:08:03.000Z",
    "createdAt": "2026-08-30T14:33:04.000Z",
    "isPinned": "No",
    "trayPosition": 1,
    "source": "profile",
    "items": [
      {
        "imageUrl": "https://scontent-lim1-1.cdninstagram.com/v/t51.71878-15/789979040_5075074616052230_9021066390302051949_n.jpg?stp=dst-jpg_e15_tt6&_nc_cat=106&ig_cache_key=Mzk3NTE1Mzg1OTIyMzk5OTU4Nw%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IlNUT1JZLnhwaWRzLjY0MC5zZHIudmlkZW9fZGVmYXVsdF9jb3Zlcl9mcmFtZS5DMyJ9&_nc_ohc=rU1wVx7RFm4Q7kNvwGgRNRG&_nc_oc=Adok8zve9CcWHYvCndKATyrYDgf7BWVa_eWV8nFEbr-X9P2qxOdPQnXhbz9utFuzrP43KXXqdvxlUMDU0UvHlwLY&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-lim1-1.cdninstagram.com&_nc_gid=uqQwEYPLuDth6iW4QLILVg&_nc_ss=7a22e&oh=00_AQO_ugp7klz1Vs6iBe7Le6DK2VwMkn1y9ItfwiPOsNcsCA&oe=6AC0EF10",
        "id": "3975153859223999587",
        "mediaType": "video",
        "videoUrl": "https://scontent-lim1-1.cdninstagram.com/o1/v/t2/f2/m78/AQMKSA74hL9lQMtgb1F-wlDzHwm07tACjzyrfO-7CllYwOGbFhbhHWdrcz3kwwGs2EfKBHd62y4BdHkgUPzjTT49sbL8QFE-1PBtMIE.mp4?_nc_cat=103&_nc_sid=5e9851&_nc_ht=scontent-lim1-1.cdninstagram.com&_nc_ohc=JMqX0-JPnCUQ7kNvwEsJgGg&efg=eyJ2ZW5jb2RlX3RhZyI6Inhwdl9wcm9ncmVzc2l2ZS5JTlNUQUdSQU0uU1RPUlkuQzMuNzIwLmRhc2hfYmFzZWxpbmVfMV92MSIsInhwdl9hc3NldF9pZCI6MTg2NDI3MjQ0NDQwNDkxNTIsImFzc2V0X2FnZV9kYXlzIjoyOSwidmlfdXNlY2FzZV9pZCI6MTA4MjYsImR1cmF0aW9uX3MiOjIwLCJ1cmxnZW5fc291cmNlIjoid3d3In0%3D&ccb=17-1&vs=6f0f05d6bddba8af&_nc_vs=HBksFQIYUWlnX3hwdl9wbGFjZW1lbnRfcGVybWFuZW50X3YyLzBFNDI4Nzc3MkM5MEYwODVBOTcwQjUzNkM3MTE0MDg0X3ZpZGVvX2Rhc2hpbml0Lm1wNBUAAsgBEgAVAhhRaWdfeHB2X3BsYWNlbWVudF9wZXJtYW5lbnRfdjIvREM0QTk2NTI1QkNGOEE3MzA2NEM4MkU4MUE2M0UwOEZfYXVkaW9fZGFzaGluaXQubXA0FQICyAESACgAGAAbAogHdXNlX29pbAExEnByb2dyZXNzaXZlX3JlY2lwZQExFQAAJoC8kIKx3Z1CFQIoAkMzLBdANKp--dsi0RgSZGFzaF9iYXNlbGluZV8xX3YxEQB16AdllKkBAA&_nc_gid=uqQwEYPLuDth6iW4QLILVg&_nc_ss=7a22e&_nc_zt=28&oh=00_AQO2I2CS-ZI0Y-DbWoIxN1YThS__S8iss98oJA8-CL4w5w&oe=6ABD0090",
        "takenAt": "2026-08-30T13:08:03.000Z",
        "takenAtTimestamp": 1788095283,
        "durationSeconds": 20.641,
        "hasAudio": "Yes",
        "width": 1080,
        "height": 1920,
        "mentions": [],
        "hashtags": [],
        "links": [
          {
            "url": "https://go.nasa.gov/adoptapixel",
            "displayUrl": "go.nasa.gov/adoptapixel",
            "linkTitle": "Visit Link"
          }
        ],
        "locations": [],
        "isPaidPartnership": "No",
        "productType": "story"
      }
    ],
    "scrapedAt": "2026-09-29T01:15:46.234Z",
    "error": null
  },
  {
    "imageUrl": "https://scontent-lim1-1.cdninstagram.com/v/t51.71878-15/718648521_1211952567628335_6800572588539032748_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_ht=scontent-lim1-1.cdninstagram.com&_nc_cat=103&_nc_oc=Q6cZ2gHtaj_N7DK8XOLXA_Y-6sWVTBxHRkAt4DXfVB31_axoepT1bmwd8vD78pROe6zdm4Fgk44n20ZLOPeEDeLYdX5F&_nc_ohc=8HUpWUJpP0EQ7kNvwE-MhM6&_nc_gid=uqQwEYPLuDth6iW4QLILVg&edm=ANmP7GQBAAAA&ccb=7-5&oh=00_AQOQmJM_w11DB72E8PRg9kfUginQzKE8zLzQEIe_Q-dDdQ&oe=6AC0D086&_nc_sid=982cc7",
    "highlightId": "18201653992314974",
    "title": "Artemis III",
    "highlightUrl": "https://www.instagram.com/stories/highlights/18201653992314974/",
    "username": "nasa",
    "profileUrl": "https://www.instagram.com/nasa/",
    "ownerId": "528817151",
    "ownerFullName": "NASA",
    "ownerIsVerified": "Yes",
    "itemCount": 20,
    "itemsReturned": 20,
    "imageCount": 11,
    "videoCount": 9,
    "totalVideoSeconds": 312.162,
    "linkCount": 5,
    "mentionCount": 8,
    "firstItemAt": "2026-06-07T19:56:27.000Z",
    "lastItemAt": "2026-06-10T23:41:08.000Z",
    "createdAt": "2026-06-08T16:55:15.000Z",
    "isPinned": "No",
    "trayPosition": 3,
    "source": "profile",
    "items": [
      {
        "imageUrl": "https://scontent-lim1-1.cdninstagram.com/v/t51.71878-15/719223587_2357865821409127_2900524585503862567_n.jpg?stp=dst-jpg_e15_tt6&_nc_cat=106&ig_cache_key=MzkxNTg4NDgwNjI1MjY0MzA5MA%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IlNUT1JZLnhwaWRzLjY0MC5zZHIudmlkZW9fZGVmYXVsdF9jb3Zlcl9mcmFtZS5DMyJ9&_nc_ohc=EA1T02kWcKAQ7kNvwHTZcv6&_nc_oc=AdqHYdscvxOBKaXNZ6VcL8ABjObL28EwiD2iEGxQ7etffIur0DTIDwD4DjVkXRCAT2oJbgkEYqg20u5OEZduaXby&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-lim1-1.cdninstagram.com&_nc_gid=uqQwEYPLuDth6iW4QLILVg&_nc_ss=7a22e&oh=00_AQPAxo0bVcsK6-yTiIjCCcbnU_7YdJx-acHQB6mgK7RBxw&oe=6AC0C8FB",
        "id": "3915884806252643090",
        "mediaType": "video",
        "videoUrl": "https://scontent-lim1-1.cdninstagram.com/o1/v/t2/f2/m78/AQPiwabqGRGlCFpt7jzvy_uHj1o8oDrnQ8pGHWbx68MvlYhsUqA1dn39MdsHRB8-NES3a41-HzpiR2tqZzSRJgzqZ7kzQthO_iU0uPg.mp4?_nc_cat=107&_nc_sid=5e9851&_nc_ht=scontent-lim1-1.cdninstagram.com&_nc_ohc=n_S9RuaY_jQQ7kNvwHzHoD5&efg=eyJ2ZW5jb2RlX3RhZyI6Inhwdl9wcm9ncmVzc2l2ZS5JTlNUQUdSQU0uU1RPUlkuQzMuNzIwLmRhc2hfYmFzZWxpbmVfMV92MSIsInhwdl9hc3NldF9pZCI6MTg2MTY1MDg4ODEwNDkxNTIsImFzc2V0X2FnZV9kYXlzIjoxMTEsInZpX3VzZWNhc2VfaWQiOjEwODI2LCJkdXJhdGlvbl9zIjoxNCwidXJsZ2VuX3NvdXJjZSI6Ind3dyJ9&ccb=17-1&vs=8ae5ec5cf869640b&_nc_vs=HBksFQIYUWlnX3hwdl9wbGFjZW1lbnRfcGVybWFuZW50X3YyL0EwNDk4NUIxNzY3OThBODI1OEZGOUFBN0Y1RDBEMEJEX3ZpZGVvX2Rhc2hpbml0Lm1wNBUAAsgBEgAVAhhRaWdfeHB2X3BsYWNlbWVudF9wZXJtYW5lbnRfdjIvMDY0Mjk3MDNENDExNjBFQURFMEQ0RTkyQjFFOEZCQkRfYXVkaW9fZGFzaGluaXQubXA0FQICyAESACgAGAAbAogHdXNlX29pbAExEnByb2dyZXNzaXZlX3JlY2lwZQExFQAAJoDZgO2355FCFQIoAkMzLBdALd2yLQ5WBBgSZGFzaF9iYXNlbGluZV8xX3YxEQB16AdllKkBAA&_nc_gid=uqQwEYPLuDth6iW4QLILVg&_nc_ss=7a22e&_nc_zt=28&oh=00_AQNfql-J207AbYNDj9KeiL_nNaoyX9dKSNp61RE6GY_ZgQ&oe=6ABCE020",
        "takenAt": "2026-06-09T18:31:03.000Z",
        "takenAtTimestamp": 1781029863,
        "durationSeconds": 14.933,
        "hasAudio": "Yes",
        "width": 1080,
        "height": 1920,
        "mentions": [
          "astro_andred"
        ],
        "hashtags": [],
        "links": [
          {
            "url": "https://www.nasa.gov/people/nasa-astronaut-andre-douglas/",
            "displayUrl": "nasa.gov/people/nasa-astronaut-andre-douglas/",
            "linkTitle": "Visit Link"
          }
        ],
        "locations": [],
        "isPaidPartnership": "No",
        "productType": "story"
      }
    ],
    "scrapedAt": "2026-09-29T01:15:46.271Z",
    "error": null
  },
  {
    "imageUrl": "https://scontent-lim1-1.cdninstagram.com/v/t51.71878-15/755331856_1609699020573638_4426177467586352650_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_ht=scontent-lim1-1.cdninstagram.com&_nc_cat=1&_nc_oc=Q6cZ2gFHbNlRyJzi5ac_weWxJRtg_nlzESGu8KM72bqCHmkIq2eZrVVP1mYxxFPNoIbjWfkakD3fMLNlV39TFMlF8obJ&_nc_ohc=tAcGB6_IgWIQ7kNvwEQvMem&_nc_gid=XM6JRb2PrQfJQzPkWiatIw&edm=ANmP7GQBAAAA&ccb=7-5&oh=00_AQMu3bYmZgFOu_OToBbcBowp8D5AUXKNwWmH00uQ1cFlkg&oe=6AC0DEB3&_nc_sid=982cc7",
    "highlightId": "18029499352961095",
    "title": "what’s new",
    "highlightUrl": "https://www.instagram.com/stories/highlights/18029499352961095/",
    "username": "instagram",
    "profileUrl": "https://www.instagram.com/instagram/",
    "ownerId": "25025320",
    "ownerFullName": "Instagram",
    "ownerIsVerified": "Yes",
    "itemCount": 44,
    "itemsReturned": 44,
    "imageCount": 18,
    "videoCount": 26,
    "totalVideoSeconds": 301.663,
    "linkCount": 0,
    "mentionCount": 11,
    "firstItemAt": "2026-01-26T18:57:40.000Z",
    "lastItemAt": "2026-09-10T19:59:46.000Z",
    "createdAt": "2024-04-18T16:14:01.000Z",
    "isPinned": "No",
    "trayPosition": 3,
    "source": "profile",
    "items": [
      {
        "imageUrl": "https://scontent-lim1-1.cdninstagram.com/v/t51.82787-15/621936830_18696393061001321_4751158615057691379_n.jpg?stp=dst-jpg_e35_tt6&_nc_cat=104&ig_cache_key=MzgxODc3ODI0MDg1MzY0MTAxNQ%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IlNUT1JZLnhwaWRzLjExNzAuc2RyLnJlZ3VsYXJfcGhvdG8uQzMifQ%3D%3D&_nc_ohc=SV9Bwc5EwxoQ7kNvwE1Rk3v&_nc_oc=AdrHInkkWB5D4pFAhhT9driN46NMZsCLp2A-eyMUiFSagd3rKcLpfP1cBw99pk_54c-L3w7IFncgHOq84u6C_Fkn&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-lim1-1.cdninstagram.com&_nc_gid=XM6JRb2PrQfJQzPkWiatIw&_nc_ss=7a22e&oh=00_AQM3c-PKg0sTrPBIU2ZQs8b5N3bFPivheeyq4ivo5x0GWQ&oe=6AC0FECA",
        "id": "3818778240853641015",
        "mediaType": "image",
        "videoUrl": "N/A",
        "takenAt": "2026-01-26T18:57:40.000Z",
        "takenAtTimestamp": 1769453860,
        "durationSeconds": "N/A",
        "hasAudio": "N/A",
        "width": 1170,
        "height": 2080,
        "mentions": [
          "meta.ai"
        ],
        "hashtags": [],
        "links": [],
        "locations": [],
        "isPaidPartnership": "No",
        "productType": "story"
      }
    ],
    "scrapedAt": "2026-09-29T01:15:57.442Z",
    "error": null
  }
]
```

### ✨ Why choose this Actor

- 🧾 **Highlights and frames in one pass.** No second tool to turn highlight IDs into media.
- 🔓 **No login needed.** Public profiles work without an Instagram account. A session cookie is optional and only matters for profiles with more than 10 highlights.
- 🔗 **Real link targets.** Link stickers come back as the destination URL, ready for UTM and affiliate analysis.
- 📅 **Original post dates.** `takenAt` is when each frame was first posted, not when it was added to the highlight.
- 🧮 **Ready-made counts.** Photo/video split, seconds of video, links and mentions per highlight.
- 🧱 **Clear error rows.** Private accounts, unknown usernames and deleted highlights each get a plain-English row and are never charged.

### 📈 How it compares to alternatives

| | This Actor | Highlight-by-ID tools | Manual download |
|---|---|---|---|
| Input | Usernames, profile links, highlight links or IDs | One highlight ID per run | One highlight at a time |
| Highlight list per profile | ✅ first 10 logged out, full tray with your session cookie | ❌ | ✅ |
| Frames with image and MP4 links | ✅ | ✅ | ✅ |
| Link sticker destination | ✅ unwrapped URL | ❌ | Manual |
| Mentions, hashtags, locations | ✅ | Partial | Manual |
| Per-highlight summary counts | ✅ | ❌ | ❌ |
| Needs an Instagram account | No | No | Yes, for most viewers |

Instagram shows logged-out visitors the first 10 highlights of a profile. The Actor tells you when a profile has more, and you can read the rest with your own session cookie or by passing their highlight links.

### 🚀 How to use

1. Create a free Apify account with $5 of credit: [sign up here](https://console.apify.com/sign-up?fpr=vmoqkp).
2. Open the Instagram Highlights Scraper and add usernames (`nasa`, `@instagram`) or profile links, and/or highlight links.
3. Set **Max Items** to the number of highlights you want in total, and optionally cap highlights per profile or frames per highlight.
4. Click **Start**. A profile with 5 highlights usually finishes in under 15 seconds.
5. Download the results as CSV, Excel, JSON or XML, or open the **Frames** view for one row per photo or video.

Example:

```json
{ "usernames": ["nasa", "instagram"], "maxItems": 10, "maxHighlightsPerProfile": 5 }
```

### 💼 Business use cases

#### 🕵️ Competitor highlight audits

See which products, FAQs, reviews and promotions competitors keep pinned, how often they refresh each highlight (`lastItemAt`) and where their link stickers send traffic.

#### 🤝 Influencer vetting

Check whether a creator's highlights carry paid partnership frames, which brands they mention and link, and how recent their highlight content is before you sign a deal.

#### 🔗 Link and promo tracking

Collect every link sticker a brand has kept in its highlights, with the real destination URL, to monitor landing pages, UTM tags and discount campaigns.

#### 🗂 Campaign archiving

Save the images and MP4 files of your own or your clients' highlights with their original post dates, before they are edited or removed.

### 🔌 Automating Instagram Highlights Scraper

- **Make and Zapier:** start a run on a schedule and push new highlight rows to Google Sheets, Airtable or a CRM.
- **Slack:** post a message when a competitor adds a highlight or a new link sticker appears.
- **Airbyte:** load the dataset into your warehouse for trend analysis.
- **GitHub Actions:** run weekly snapshots and diff the highlight list over time.
- **Google Drive:** store the exported CSV or JSON files next to your reports.

### 🌟 Beyond business use cases

- 🎓 **Research:** study how organisations use long-lived story content, or how often highlights are refreshed.
- 🧑‍💻 **Personal:** keep an offline copy of highlights from accounts you follow for travel tips, recipes or tutorials.
- 🌱 **Non-profit:** archive public awareness campaigns kept in highlights.
- 🧪 **Experimentation:** build datasets of vertical video and story design for computer vision or design research.

### 🤖 Ask an AI assistant about this scraper

Paste this README into ChatGPT, Claude or Gemini and ask how to combine it with the ParseForge Instagram profile, posts and reels actors for a full account audit.

### ❓ Frequently Asked Questions

#### 🔑 Do I need an Instagram account?

No. Public profiles and public highlights work logged out. The optional session cookie only unlocks highlights past the first 10 of a profile.

#### 🔢 Why do I get at most 10 highlights from a profile?

That is what Instagram shows logged-out visitors. The run log says when a profile has more. Add your own session cookie, or paste the extra highlight links into **Highlight links or IDs**; those are read in full without a login.

#### 🍪 How do I get my session cookie, and is it safe?

Log in to instagram.com in your browser, open the developer tools, and copy the value of the `sessionid` cookie. The field is stored encrypted and never written to the log. Use an account you own and keep volumes reasonable.

#### 🎞 What is one row?

One highlight. Its frames are nested inside it, so a highlight with 40 frames is still one row. Use the **Frames** view or `unwind=items` for one row per frame.

#### 📅 What is the difference between takenAt and createdAt?

`takenAt` is when a frame was posted as a story. `createdAt` is when the highlight itself was created. Frames added to a highlight later can be older than the highlight.

#### ⏱ Why is durationSeconds "N/A" on some frames?

Those frames are photos. Videos carry their length in seconds, for example 26.816.

#### 🔗 Why do link stickers show a different URL than on Instagram?

Instagram wraps story links in an `l.instagram.com` redirect. The Actor returns the real destination and keeps the text shown on the sticker in `displayUrl`.

#### 🔒 What happens with private accounts?

You get an uncharged row saying the account is private. Their highlights are not public.

#### 🚫 What if a username does not exist or a highlight was deleted?

You get an uncharged error row that names the input. If every input fails, the run is marked as failed so you notice.

#### ⌛ Do the image and video links expire?

Instagram's media links are signed and stop working after a few days. Download the files you need soon after the run, or run the Actor again for fresh links.

#### 🛡 Do I need a proxy?

The default Apify proxy works. Profile pages switch to residential addresses automatically when Instagram rate-limits datacenter addresses, so large runs keep going.

#### 🧩 Can I combine it with other Instagram data?

Yes. The `username` and `profileUrl` fields match the ParseForge Instagram profile, posts and reels actors, so rows join directly.

### 🔌 Integrate with any app

Use the Apify API, the JavaScript and Python clients, webhooks or the Make, Zapier and n8n integrations to send highlight data wherever you work.

### 🔗 Recommended Actors

Next step: feed the same usernames into these ParseForge actors for the rest of the account.

- [Instagram Profile Scraper](https://apify.com/parseforge/instagram-profile-scraper)
- [Instagram Posts Scraper](https://apify.com/parseforge/instagram-posts-scraper)
- [Instagram Reel Scraper](https://apify.com/parseforge/instagram-reel-scraper)
- [Instagram Search Scraper](https://apify.com/parseforge/instagram-search-scraper)
- [Instagram Hashtag Scraper](https://apify.com/parseforge/instagram-hashtag-analytics-scraper)

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge).

**🆘 Need Help?** [Open our contact form](https://tally.so/r/BzdKgA)

> **⚠️ Disclaimer:** this is an independent tool, not affiliated with Instagram or Meta Platforms. It collects only publicly available data.

# Actor input Schema

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

Public Instagram accounts whose story highlights you want. Accepts nasa, @nasa or https://www.instagram.com/nasa/. Without a session cookie Instagram shows the first 10 highlights of each profile (the ones at the front of the tray).

## `highlightUrls` (type: `array`):

Specific highlights to read, as links like https://www.instagram.com/stories/highlights/18195781759377100/ or bare highlight IDs. Works for any public highlight, including ones past the first 10 of a profile.

## `maxItems` (type: `integer`):

Maximum number of highlights (dataset rows) in total. Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000

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

Take at most this many highlights from each profile, in tray order (pinned and newest first). 0 = all available.

## `maxItemsPerHighlight` (type: `integer`):

Keep at most this many frames (photos/videos) inside each highlight row. 0 = all frames. The row still reports the highlight's full frame count.

## `sessionCookie` (type: `string`):

The value of your own Instagram 'sessionid' cookie (or the full cookie string). When set, the full highlights tray of each profile is read instead of the first 10. Leave empty to scrape logged out. Use an account you own; it is stored encrypted and never logged.

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

Apify proxy settings. Choose RESIDENTIAL for large runs.

## Actor input object example

```json
{
  "usernames": [
    "nasa",
    "instagram"
  ],
  "maxItems": 10,
  "maxHighlightsPerProfile": 0,
  "maxItemsPerHighlight": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Key fields

## `fullData` (type: `string`):

Complete dataset with all 25 fields

## `frames` (type: `string`):

Every story frame as its own row, with the highlight fields repeated

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

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

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

```

## MCP server setup

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