Instagram Highlights Scraper - Stories & Media
Pricing
from $2.50 / 1,000 highlight story items
Instagram Highlights Scraper - Stories & Media
Scrape Instagram story highlights from any public profile or highlight ID. Returns every story item with image or video URL, timestamp, caption, duration and music, plus highlight titles and covers. No login or cookies needed.
Pricing
from $2.50 / 1,000 highlight story items
Rating
0.0
(0)
Developer
Khadin Akbar
Maintained by CommunityActor stats
0
Bookmarked
735
Total users
411
Monthly active users
a day ago
Last modified
Categories
Features
Share
What is Instagram Highlights Scraper?
Scrape Instagram story highlights, and optionally the current 24-hour stories, from any public profile, or highlights by ID. The actor returns every story item inside each highlight with image and video CDN URLs, timestamps, captions, video duration, and music metadata, plus the highlight title, cover, and owner context. It is provider-backed with the primary data provider first and the fallback data provider fallback, so it needs no Instagram login, cookies, browser, or proxy setup.
What It Extracts
By default (includeStories: true) one dataset row is one story item, with the highlight and owner metadata denormalized on every row — so spreadsheets, BI tools, and AI agents can filter and join without a second lookup.
| Field | Description |
|---|---|
recordType | story (default mode), highlight (list-only mode) or active_story (current 24-hour story) |
highlightId | Instagram highlight reel ID |
highlightTitle | Display title of the highlight tray |
highlightUrl | Canonical URL of the highlight |
position | 1-based position of the item inside the highlight |
mediaId | Instagram media ID of the story item |
shortcode | Public shortcode of the item |
storyUrl | Canonical Instagram story URL |
mediaType | video or image |
imageUrl / thumbnailUrl | Image CDN URLs (full and thumbnail) |
videoUrl | Progressive MP4 CDN URL for video items |
videoDuration | Video length in seconds |
hasAudio | Whether the video carries audio |
width / height | Original media dimensions in pixels |
caption | Caption text, when present |
likeCount / commentCount | Aggregated counts, when the provider exposes them |
isPaidPartnership | Paid-partnership marker |
musicArtist / musicTitle | Attached music sticker metadata, when present |
takenAt | ISO 8601 timestamp of the original post |
expiresAt | When an active story disappears (active_story rows only) |
mentions | Usernames tagged with mention stickers |
links | Link-sticker destination URLs (Instagram redirect removed) |
hashtags / locationName | Hashtag and location stickers, when present |
stickers | Interactive stickers when present: polls and quizzes (options and vote counts when Instagram shows them), question prompts, sliders (vote count and average), countdowns. Answers typed into a question sticker are visible only to the account owner, so they are never available |
ownerId / ownerUsername / ownerVerified | Highlight owner identity |
coverImageUrl | Highlight cover (highlight rows) |
provider / scrapedAt / sourceUrl | Provenance fields |
When To Use
This actor works well for:
- Archiving a brand's or competitor's permanent highlight content before it changes
- Competitive analysis of how accounts organize story marketing into highlights
- Collecting highlight media URLs for content libraries and creative research
- Auditing paid-partnership disclosures inside story highlights
- Feeding AI agents one clean highlight-item dataset from usernames or highlight IDs
Turn on includeActiveStories to also capture the 24-hour stories tray (set includeHighlights: false to get only current stories). For profile metadata, posts, reels, comments, hashtags, and follower lists, route to the matching Instagram actors in this portfolio (see Related Actors) — each is a focused standalone workflow for its own entity.
Best Fit
Choose this actor when your starting point is a public profile handle (or a highlight link you already hold) and your deliverable is highlight content: tray titles, covers, and every story item with media URLs and timestamps. Start with includeStories: false to inventory trays cheaply, then feed the highlight IDs that matter into a second expanded run. Pair it with the Instagram Profile Scraper when you also need follower counts and bio context for the same accounts.
Input
{"usernames": ["instagram"],"includeStories": true,"maxHighlightsPerUser": 20,"maxStoriesPerHighlight": 100,"maxTotalItems": 5000}
Current 24-hour stories only:
{"usernames": ["instagram"],"includeActiveStories": true,"includeHighlights": false}
You can also skip the profile listing entirely and pass direct highlight IDs or URLs:
{"highlightIds": ["https://www.instagram.com/stories/highlights/18142207969557132/"]}
Important Inputs
| Input | Default | Notes |
|---|---|---|
usernames | ["instagram"] | Handles, @handles, or profile URLs |
highlightIds | none | Highlight IDs or highlight URLs, with or without usernames |
includeStories | true | Expand every story item; false saves one cheap row per highlight |
includeActiveStories | false | Also save the current 24-hour stories of each username |
includeHighlights | true | Turn off to skip highlights and get only active stories |
includeStatusRows | false | Add one free target_status row per input to the dataset (found, not found, private, no highlights, not processed). Off by default so existing pipelines see no new rows |
maxActiveStoriesPerUser | 100 | Active stories saved per username (1–200) |
maxHighlightsPerUser | 20 | Highlights processed per username (1–200) |
maxStoriesPerHighlight | 100 | Story items saved per highlight (1–1000) |
maxTotalItems | 5000 | Run-wide row cap and spend guard |
providerOrder | The default provider order | Provider routing; fallback is automatic |
includeRawData | false | Attach raw provider payloads for debugging |
Output Example
Real row from the instagram account's "creatives" highlight:
{"recordType": "story","highlightId": "18142207969557132","highlightTitle": "creatives","highlightUrl": "https://www.instagram.com/stories/highlights/18142207969557132/","position": 1,"mediaId": "3811480328699137079","shortcode": "DTlGSo0gEw3","storyUrl": "https://www.instagram.com/stories/instagram/3811480328699137079/","mediaType": "video","imageUrl": "https://scontent-bos5-1.cdninstagram.com/v/t51.71878-15/616341681_1403647328019524_609409640201682429_n.jpg","videoUrl": "https://scontent-bos5-1.cdninstagram.com/o1/v/t2/f2/m78/AQOd_6Ko6XVGRcbkl_piTFNNSHU2UxFWfFIjpdnK15GwiAeoa4EGsWVl869bbZ1oRLu0AwmWSNL0jEU8pK-CN8N13ZChU-BfJgFSRi4.mp4","videoDuration": 24.333,"hasAudio": true,"width": 1080,"height": 1920,"takenAt": "2026-01-16T17:17:56.000Z","ownerId": "25025320","ownerUsername": "instagram","ownerVerified": true,"scrapedAt": "2026-08-17T00:00:00.000Z","sourceUrl": "https://www.instagram.com/instagram/"}
Pricing
This actor uses Pay per event (PPE) pricing with Apify platform usage included.
| Event | Price |
|---|---|
| Actor start | $0.00005 |
Highlight story item saved (includeStories: true) | $0.003 on Free and Bronze, $0.0028 Silver, $0.0025 Gold, Platinum and Diamond |
Highlight row saved (includeStories: false) | $0.002 |
Active 24-hour story saved (includeActiveStories: true) | Same price as a story item for your plan |
Status rows (includeStatusRows: true) | Free, never charged |
With includeStories: false, direct highlight IDs also return one highlight record rather than expanded stories. Only one result event applies to any given row: expanded runs charge per story item and never additionally per highlight; list-only runs charge per highlight row. See the Pricing tab on this actor's page for the live price table. Apify platform usage is included in the event price, and the run's opening status message shows the approximate maximum event cost from your input caps before work starts.
Free Apify plan
Runs started from a free Apify plan return up to 250 results per run, with every input mode and output field available. Paid Apify plans have no per-run limit, so your usual result settings apply.
Reliability
The actor routes every request through managed public-data providers:
- The primary data provider for the primary highlights and highlight-detail routes.
- The fallback data provider as automatic fallback when the primary errors, rate-limits, or returns nothing usable.
Runs write matching OUTPUT and RUN_SUMMARY records with provider attempts, status codes, saved-row counts, credit usage, stop reason, and estimated event cost. A TERMINAL_FENCE with state DONE confirms that both records were read back. Recognized empty profiles remain distinguishable from provider outages; malformed responses and exhausted required routes fail when no useful data remains. Usernames or highlight IDs that Instagram reports as not found, deleted or private are not charged and do not stop the run: each one appears in the targets list of OUTPUT with status not_found, private or no_highlights, and a run where every input is like that ends successfully as VALID_EMPTY.
Unknown provider credit usage and unconfirmed delivery counts are reported as null. After an ambiguous save or a restart with an existing checkpoint, the Actor stops further paid work. Inspect the Dataset, charges and saved diagnostics before starting a new run. The checkpoint is a single-writer replay guard, not an atomic Dataset-and-charge transaction.
Workflow Story
A typical workflow: a social team tracks five competitor accounts. They first run the actor with includeStories: false across all five handles to inventory highlight trays cheaply, then re-run with highlightIds pinned to the two trays that matter and maxStoriesPerHighlight raised, feeding the media URLs into their creative asset library. Each run ends with a RUN_SUMMARY they can diff week over week to see which highlights were renamed, re-covered, or removed.
API Example
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('khadinakbar/instagram-highlights-scraper').call({usernames: ['instagram'],includeStories: true,maxHighlightsPerUser: 10,maxStoriesPerHighlight: 50,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
MCP And AI Agents
This actor is exposed through Apify MCP as khadinakbar/instagram-highlights-scraper. Agent prompt card:
Scrape Instagram story highlights for one or more public profiles or highlight IDs. Use it when you need highlight titles, covers, or every story item with media URLs and timestamps; set
includeActiveStoriesfor current 24-hour stories; route to a sibling Instagram actor for posts, reels, comments, or profiles. Returns one row per story item (recordType: "story"or"active_story") or per highlight in list-only mode, plus aRUN_SUMMARY; setincludeStatusRowsto also get one freetarget_statusrow per input with provider telemetry and cost. Costs $0.0025 to $0.003 per story item depending on your Apify plan, $0.002 per highlight row, plus a $0.00005 start.
Best Results Guidance
- Provide exact handles without spaces; profile URLs also work as input.
- Start with
includeStories: falsewhen you only need to discover highlight trays, then pass selectedhighlightIdsto an expanded run. - Use the current limit names (
maxTotalItems,maxStoriesPerHighlight,maxHighlightsPerUser). Legacy aliases, when present, add a limit; the smaller bound wins. - Cap spend with
maxTotalItems; the status message shows the cost ceiling before rows are billed. - Treat a profile with zero highlights as a valid empty result: confirm with
RUN_SUMMARY.usersWithZeroHighlightsbefore retrying. - Schedule list-only passes weekly and expanded runs on demand to keep archival costs predictable.
Builder's Note
I built this actor because highlights are the most stable part of Instagram's story surface — they outlive the 24-hour tray — yet each provider returns them through a different envelope: one ships an array, the other an index-keyed object. I found the normalizer had to flatten both into the same row shape before the dataset stayed schema-stable across provider fallbacks. In my testing, public profiles with zero highlights returned a clean VALID_EMPTY outcome, which keeps batch jobs honest when a brand simply has no trays.
Limits
- Public profiles and public highlights only; no private accounts or login-gated data.
- Active stories exist only for 24 hours. A profile with no current stories, or a private profile, returns no active rows and is not charged.
- A story that is both live now and already saved to a highlight appears once as
active_storyand once asstory; each saved row is billed once. - Usernames that do not exist, were renamed, or are private are reported in the
targetslist ofOUTPUTand are never charged. Turn onincludeStatusRowsto also get them astarget_statusrows in the dataset. - Sticker data depends on what Instagram exposes: most story items have no interactive sticker, and live 24-hour stories carry fewer sticker details than highlight stories.
- Story items are returned exactly as Instagram exposes them; some fields (likes, music) are absent on some items.
- Very large highlight collections are bounded by
maxHighlightsPerUserandmaxStoriesPerHighlight. maxTotalItemscaps billed rows per run; use it as a spend guard for batches.- Media URLs are Instagram CDN links with expiry; download promptly if you need the files.
Related Actors
- Instagram Posts Scraper for profile posts and hashtag feeds.
- Instagram Profile Scraper for profile metadata.
- Instagram Reels Scraper for reels feeds.
- Instagram User Scraper when you need to resolve and verify profile identity first.
- Instagram Trending Reels Scraper for discovering trending reels before choosing which profiles to track.
Legal
Use this actor only for public Instagram content you are allowed to access and process. You are responsible for complying with Instagram's Terms of Service, privacy laws, data protection rules, and any platform or jurisdiction-specific requirements. This actor does not access private accounts or login-gated content.