Instagram Stories & Highlights Scraper avatar

Instagram Stories & Highlights Scraper

Pricing

from $2.50 / 1,000 story item saveds

Go to Apify Store
Instagram Stories & Highlights Scraper

Instagram Stories & Highlights Scraper

Scrape public Instagram story highlights and the live 24-hour story tray for one or more usernames. Returns one record per story item with original media URLs, timestamps, captions, music, mentions and links as structured JSON. No login required for highlights.

Pricing

from $2.50 / 1,000 story item saveds

Rating

0.0

(0)

Developer

Khadin Akbar

Khadin Akbar

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

8 days ago

Last modified

Share

Capture every story item from public Instagram highlight reels — plus the live 24-hour tray when it is reachable — as structured, exportable rows. Each row carries the original media URL, timestamp, caption, music, mentions, hashtags, and links for one story item. Built for social media managers, brand marketers, journalists, and AI agents that need permanent, analyzable copies of ephemeral story content.

Best fit for this Actor

Choose this Actor when you have public usernames and need their archived story highlights as a clean dataset for content strategy, campaign archiving, or monitoring. It works as a focused standalone workflow: provide usernames, read the terminal outcome, then export the default dataset. For the permanent feed behind a story item, use the Instagram Posts Scraper next; it returns the lasting feed rather than ephemeral story items.

What data you receive

Each dataset row represents one story item captured from a highlight reel (source: "highlight") or the live tray (source: "story").

FieldMeaning
id, positionStory item identity and order inside its reel
ownerUsername, ownerIdPublic profile the story belongs to
source, highlightId, highlightTitleWhere the item came from and its parent reel
mediaType, mediaUrl, thumbnailUrl, width, heightMedia kind and best available CDN renditions
takenAt, expiresAtPublish time; expiry for ephemeral tray items
caption, musicTitle, musicArtistText and music sticker metadata when present
mentions, hashtags, linksExtracted tags, @-mentions, and sticker/caption URLs
provider, scrapedAtCapture route and freshness timestamp

Fields stay null when Instagram exposes no stable public value for that item. The actor records only what it observes.

Input

Pass public usernames, profile URLs, or numeric user IDs. The actor deduplicates entries, strips @ prefixes, and applies maxResults across the entire run.

{
"usernames": ["natgeo", "https://www.instagram.com/instagram/"],
"includeStories": true,
"includeHighlights": true,
"expandHighlightItems": true,
"maxHighlightsPerUser": 10,
"maxResults": 200
}

maxResults is a strict 1–2000 cap on saved rows; maxHighlightsPerUser bounds provider cost per profile (1–25, default 10). An optional sessionCookie (treated as a secret) supplies your own logged-in sessionid to make live tray reads reliable; it is never required for highlights.

Example output

{
"id": "3551234567890123456",
"ownerUsername": "instagram",
"ownerId": "25025320",
"source": "highlight",
"highlightId": "18142207969557132",
"highlightTitle": "creatives",
"mediaType": "video",
"mediaUrl": "https://scontent-mia3-3.cdninstagram.com/v/t51...mp4",
"thumbnailUrl": "https://scontent-mia3-3.cdninstagram.com/v/t51...jpg",
"width": 1080,
"height": 1920,
"takenAt": "2026-01-16T17:17:56.000Z",
"expiresAt": null,
"caption": "New drop! #design",
"musicTitle": "Golden Hour",
"musicArtist": "JVKE",
"mentions": ["natgeo"],
"hashtags": ["design"],
"links": ["https://example.com/go"],
"position": 1,
"provider": "scrapecreators",
"scrapedAt": "2026-08-17T12:00:00.000Z"
}

Pricing

Pay per event: $0.0025 per validated story item plus a $0.0025 profile scan and a $0.00005 Actor start event. Platform usage is additional because Pay per event + usage is enabled in the live Pricing tab. A story item is billed only after its complete validated row is saved, and a profile scan is billed only after the profile has been scanned successfully. The run status message shows the maximum event-charge estimate before any request fires.

Reliability and sources

Highlight capture runs through managed public-data providers — ScrapeCreators primary, SociaVault fallback — using owner-managed API keys, with no Instagram login and no user cookies. Live 24-hour tray reads are attempted anonymously through residential proxy, with your optional session cookie improving reliability; when Instagram requires sign-in for the tray, the affected profile is noted in RUN_SUMMARY and you are never charged for that tray attempt.

If no route returns useful public data for any profile, the run ends as UPSTREAM_FAILED rather than reporting an empty success. Instagram changes response shapes frequently, so release evidence covers multi-profile highlight runs, sign-in-gated trays, invalid inputs, duplicate handling, and cost-cap behavior.

Workflow story

A typical monitoring week: schedule a daily run with your 10 competitor usernames, includeHighlights: true, expandHighlightItems: true, and maxResults: 500. Deduplicate on id downstream, keep the newest takenAt items, and diff captions, link stickers, and music across days to see which story content a brand promotes and for how long. Tray captures, when available, add the ephemeral layer with expiresAt.

Terminal outcomes

Every terminal path writes OUTPUT and RUN_SUMMARY in the default key-value store.

  • COMPLETE: all accepted profiles scanned cleanly.
  • PARTIAL: useful rows saved, with sign-in-gated trays, skipped inputs, or cap warnings.
  • VALID_EMPTY: scanned profiles returned no highlight or tray items.
  • INVALID_INPUT: no valid username, or an out-of-range cap was supplied.
  • UPSTREAM_FAILED: no useful output because every route was unavailable for every profile.
  • CONFIG_ERROR: deployment configuration prevented the advertised work.

The first four outcomes finish successfully; the last two signal that no advertised work was useful, so downstream automations can tell an outage from a quiet profile.

API example

import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client
.actor("khadinakbar/instagram-stories-highlights-scraper")
.call({
usernames: ["natgeo", "instagram"],
includeHighlights: true,
expandHighlightItems: true,
maxResults: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Use with an AI agent through Apify MCP

Scan these public Instagram profiles and return every story highlight item with its media URL, timestamp, caption, music, mentions, hashtags, and links. Try the live 24-hour tray too, and report which profiles require sign-in rather than retrying them. Read the terminal outcome and the dataset before summarizing, cap the output at 100 items so the cost is clear, and summarize per profile how many highlight reels and items were found.

Best results and data quality

  • Start with maxHighlightsPerUser: 10 and raise to 25 only for profiles with many reels; each expanded reel is a provider call.
  • For pure archival of permanent story content, set includeStories: false to skip tray attempts entirely and keep runs fast.
  • For live-tray monitoring, provide your own sessionCookie; anonymous tray reads are opportunistic by design.
  • Deduplicate on id when re-scanning the same profiles; Instagram media IDs are stable.

Builder's note

I built the highlight route first because it is the only story surface that stays analyzable after 24 hours. During the 2026-08 probe window, neither managed provider exposed a live-tray endpoint and anonymous tray requests required sign-in from every IP I tried, so this actor charges only for delivered items and honest scans rather than promising anonymous ephemeral access. The tray stays wired as an opportunistic route for residential proxies, and your own session cookie closes the gap when ephemeral capture is a hard requirement.

Responsible use

Use only publicly available story data in a manner consistent with Instagram's terms, privacy expectations, and applicable law. Use the actor for authorized research on public profiles rather than to access private accounts, close-friends content, or story viewer identities.