Instagram Stories & Highlights Scraper
Pricing
from $0.90 / 1,000 profiles
Instagram Stories & Highlights Scraper
Collect public Instagram story and highlight metadata from profile URLs or usernames, with status rows for auth-required, private, unavailable, and rate-limited profiles.
Pricing
from $0.90 / 1,000 profiles
Rating
0.0
(0)
Developer
Hanna Nosova
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Scrape public Instagram stories and highlights from profile usernames or URLs.
Use this actor when you need current story media, permanent highlight collections, timestamps, captions, profile context, and clear status rows for profiles that are private, missing, rate-limited, or have no available media.
What does Instagram Stories & Highlights Scraper do?
This actor processes one or more Instagram profiles and returns structured rows for active story items and saved highlight items.
It accepts usernames, @handles, and full Instagram profile URLs.
It can collect:
- Active 24-hour stories when available
- Saved highlight collections
- Individual media items inside each highlight
- Image or video media URLs
- Captions or text when Instagram exposes them
- Taken and expiry timestamps
- Profile metadata
- Stable IDs for deduplication
- Status rows for private, missing, empty, auth-required, and rate-limited profiles
Who is it for?
Social media analysts
Track brand story activity and collect highlight archives for reporting.
Creator marketing teams
Review influencer story and highlight assets during campaign monitoring.
Agencies
Build repeatable profile checks for client or competitor monitoring.
Researchers
Collect public ephemeral media metadata with structured status reporting.
Data teams
Feed story and highlight URLs into downstream storage, dashboards, or moderation workflows.
Why use this actor?
Instagram Stories are short-lived and Highlights are nested behind profile-specific collections.
This actor gives you one normalized dataset across both sources.
Benefits:
- Input can be a username or full URL
- One run can process many profiles
- Stories and highlights share a common output shape
- No-media profiles are still represented when enabled
- Optional cookies support authorized sessions
- Proxy configuration is built in
- PPE billing is profile-based and predictable
What data can you extract?
| Field | Description |
|---|---|
kind | story, highlight_item, or profile_status |
username | Instagram username |
profileUrl | Public profile URL |
profileId | Instagram numeric profile ID when available |
fullName | Profile display name |
isVerified | Whether the profile is verified |
isPrivate | Whether the profile is private |
status | ok, no_media, private, not_found, auth_required, rate_limited, or error |
mediaType | image, video, or unknown |
mediaUrl | Best available media URL |
thumbnailUrl | Image thumbnail URL |
caption | Caption/text when available |
takenAt | ISO timestamp when the item was posted |
expiringAt | ISO timestamp when a story expires |
highlightId | Highlight collection ID |
highlightTitle | Highlight title |
highlightCoverUrl | Highlight cover image URL |
sourceUrl | Profile or highlight URL used as source context |
stableId | Stable deduplication key |
errorMessage | Human-readable failure/status reason |
How much does it cost to scrape Instagram stories and highlights?
The actor uses pay-per-event pricing.
You pay a small start event and one profile event per processed Instagram profile.
The profile charge covers profile lookup, active story checks, highlight discovery, and saved highlight item collection for that profile.
Keep test runs small by starting with one or two profiles.
How to use Instagram Stories & Highlights Scraper
- Add Instagram usernames or profile URLs to
targets. - Choose whether to include active stories, highlights, or both.
- Keep
maxProfileslow for your first run. - Use Apify Proxy for more reliable access.
- Add
instagramCookiesonly when you are authorized to view the target profiles. - Start the actor.
- Download the dataset as JSON, CSV, Excel, or via API.
Input example
{"targets": ["instagram", "https://www.instagram.com/natgeo/"],"includeStories": true,"includeHighlights": true,"maxProfiles": 2,"maxHighlightsPerProfile": 10,"maxItemsPerHighlight": 20,"saveProfileOnNoMedia": true,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
Output example
{"kind": "highlight_item","username": "instagram","profileUrl": "https://www.instagram.com/instagram/","profileId": "25025320","fullName": "Instagram","isVerified": true,"isPrivate": false,"status": "ok","mediaType": "video","mediaUrl": "https://...","thumbnailUrl": "https://...","caption": "Behind the scenes","takenAt": "2026-06-20T10:15:00.000Z","expiringAt": null,"highlightId": "17900000000000000","highlightTitle": "Events","sourceUrl": "https://www.instagram.com/stories/highlights/17900000000000000/","stableId": "25025320:highlight_item:17900000000000000:123456789","errorMessage": null}
Understanding status rows
When saveProfileOnNoMedia is enabled, the actor can emit profile_status rows.
These rows help you distinguish a successful empty profile check from a failed run.
Common statuses:
no_media: profile was processed but no accessible stories/highlights were foundprivate: profile is privatenot_found: username does not exist or is unavailableauth_required: Instagram asked for login or the provided session is not authorizedrate_limited: Instagram throttled the current proxy/sessionerror: unexpected response or parsing problem
Cookies and authentication
Public Instagram data availability changes by region, IP reputation, and session state.
For some profiles or networks, Instagram may require an authenticated browser session.
You can paste an authorized Cookie header into instagramCookies.
Only use cookies from accounts and sessions you control or are authorized to use.
The actor does not bypass Instagram privacy controls.
Proxy recommendations
Instagram is rate-limited.
The input schema prefills Apify Residential Proxy because it is usually more reliable for Instagram than shared datacenter IPs.
For small tests:
- Use 1-2 profiles
- Keep highlight caps low
- Avoid repeated retries with the same blocked session
- Try a different proxy country or session if you see
rate_limited
Tips for better results
- Use profile URLs copied directly from Instagram when possible.
- Keep batches small for story monitoring jobs.
- Schedule frequent small runs instead of one large run for ephemeral stories.
- Enable status rows for monitoring dashboards.
- Use stable IDs to deduplicate across scheduled runs.
- Store media URLs quickly because upstream URLs may expire.
Integrations
You can connect the actor to:
- Google Sheets for daily profile monitoring
- Slack alerts for new story rows
- Airtable campaign trackers
- S3 or GCS media archiving workflows
- BI dashboards for creator activity
- Webhooks for status changes
API usage with Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('fetch_cat/instagram-stories-highlights-scraper').call({targets: ['instagram'],includeStories: true,includeHighlights: true,maxProfiles: 1,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
API usage with Python
from apify_client import ApifyClientimport osclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('fetch_cat/instagram-stories-highlights-scraper').call(run_input={'targets': ['instagram'],'includeStories': True,'includeHighlights': True,'maxProfiles': 1,})items = client.dataset(run['defaultDatasetId']).list_items().itemsprint(items)
API usage with cURL
curl -X POST "https://api.apify.com/v2/acts/fetch_cat~instagram-stories-highlights-scraper/runs?token=$APIFY_TOKEN" \-H 'Content-Type: application/json' \-d '{"targets":["instagram"],"maxProfiles":1,"includeStories":true,"includeHighlights":true}'
MCP usage
Use the actor through Apify MCP tools in Claude Desktop or Claude Code.
Example prompts:
- "Run the Instagram Stories & Highlights Scraper for @instagram and summarize available highlights."
- "Check whether these five profiles have accessible current stories."
- "Export highlight media URLs for this campaign profile list."
MCP URL format:
https://mcp.apify.com/?tools=fetch_cat/instagram-stories-highlights-scraper
Claude Code setup:
$claude mcp add apify-instagram-stories --transport http --url "https://mcp.apify.com/?tools=fetch_cat/instagram-stories-highlights-scraper"
Claude Desktop JSON configuration:
{"mcpServers": {"apify-instagram-stories": {"url": "https://mcp.apify.com/?tools=fetch_cat/instagram-stories-highlights-scraper"}}}
Scheduling
Stories expire quickly.
For monitoring, schedule small runs every few hours and deduplicate rows by stableId.
Highlights change less often, so daily or weekly collection may be enough.
Limits
The actor depends on what Instagram returns to the current session.
Limitations:
- Private profiles are not publicly accessible
- Some story data may require login
- Some media URLs can expire
- Instagram may rate-limit repeated requests
- Deleted or expired story items cannot be recovered
FAQ
Can this actor access private stories?
Only when you provide an authorized Instagram session that can view that profile. The actor does not bypass privacy controls.
Do I need cookies?
Cookies are optional for public checks, but Instagram often requires login for story and highlight media. Add authorized cookies when you see auth_required.
How do I get an Instagram Cookie header?
Use only cookies from an Instagram account and browser session you control or are authorized to use.
- Log in to Instagram in your browser.
- Open Developer Tools and go to the Network tab.
- Reload Instagram, open a profile, or open a stories page.
- Select a request to
instagram.com. - Copy the full
Cookierequest header value. - Paste that value into the actor input field
instagramCookies.
Refresh the cookie value if the session expires, you log out, change the account password, or Instagram asks you to log in again.
Can this actor download media files?
The actor returns public media URLs, thumbnails, timestamps, captions/text when exposed, and metadata/status rows. It does not store private media or promise permanent downloads of expired or restricted Instagram content.
Why do I get a status row instead of media?
A status row means the profile was private, unavailable, auth-required, rate-limited, had no available media, or returned an error. Use the status and errorMessage fields to decide whether to retry, add authorized cookies, or skip the profile.
Troubleshooting
Why did I get auth_required?
Instagram returned a login or checkpoint response. Add authorized cookies, reduce the batch size, or try a different proxy session.
Why did I get rate_limited?
Instagram throttled the current IP/session. Wait before retrying, use fewer profiles, or change proxy settings.
Why is mediaUrl empty?
A status row does not have media. For media rows, Instagram may occasionally omit original media URLs; check thumbnailUrl and raw for available metadata.
Legality
This actor is intended for publicly available data and authorized access workflows.
You are responsible for ensuring your use complies with applicable laws, platform terms, privacy rules, and rights in the content you collect.
Do not use the actor to access private data without authorization.
Related scrapers
More Apify actors from the same catalog can complement this actor:
- YouTube Channel Videos Scraper
- YouTube Shorts Scraper
- TikTok Profile Scraper
- Website Content Crawler Lite
Data quality checklist
After each run, review:
- Number of
okrows - Number of status rows
- Profiles with
rate_limited - Missing
mediaUrlvalues - Duplicate
stableIdvalues across schedules
First run checklist
- Start with one public profile
- Keep
maxHighlightsPerProfileat 10 or lower - Keep
maxItemsPerHighlightat 20 or lower - Use status rows
- Review the dataset before scaling up
Support notes
If a profile has public highlights in your browser but returns auth_required in the actor, Instagram is likely requiring a logged-in session for that proxy/session.
Add authorized cookies or retry later with a fresh proxy session.
Changelog
0.1
Initial build with username/profile URL inputs, active story extraction, highlight extraction, optional cookies, proxy support, structured output, and status rows.