Instagram Stories & Highlights Scraper avatar

Instagram Stories & Highlights Scraper

Pricing

from $0.90 / 1,000 profiles

Go to Apify Store
Instagram Stories & Highlights Scraper

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

Hanna Nosova

Maintained by Community

Actor 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?

FieldDescription
kindstory, highlight_item, or profile_status
usernameInstagram username
profileUrlPublic profile URL
profileIdInstagram numeric profile ID when available
fullNameProfile display name
isVerifiedWhether the profile is verified
isPrivateWhether the profile is private
statusok, no_media, private, not_found, auth_required, rate_limited, or error
mediaTypeimage, video, or unknown
mediaUrlBest available media URL
thumbnailUrlImage thumbnail URL
captionCaption/text when available
takenAtISO timestamp when the item was posted
expiringAtISO timestamp when a story expires
highlightIdHighlight collection ID
highlightTitleHighlight title
highlightCoverUrlHighlight cover image URL
sourceUrlProfile or highlight URL used as source context
stableIdStable deduplication key
errorMessageHuman-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

  1. Add Instagram usernames or profile URLs to targets.
  2. Choose whether to include active stories, highlights, or both.
  3. Keep maxProfiles low for your first run.
  4. Use Apify Proxy for more reliable access.
  5. Add instagramCookies only when you are authorized to view the target profiles.
  6. Start the actor.
  7. 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 found
  • private: profile is private
  • not_found: username does not exist or is unavailable
  • auth_required: Instagram asked for login or the provided session is not authorized
  • rate_limited: Instagram throttled the current proxy/session
  • error: 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 ApifyClient
import os
client = 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().items
print(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.

Use only cookies from an Instagram account and browser session you control or are authorized to use.

  1. Log in to Instagram in your browser.
  2. Open Developer Tools and go to the Network tab.
  3. Reload Instagram, open a profile, or open a stories page.
  4. Select a request to instagram.com.
  5. Copy the full Cookie request header value.
  6. 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.

More Apify actors from the same catalog can complement this actor:

Data quality checklist

After each run, review:

  • Number of ok rows
  • Number of status rows
  • Profiles with rate_limited
  • Missing mediaUrl values
  • Duplicate stableId values across schedules

First run checklist

  • Start with one public profile
  • Keep maxHighlightsPerProfile at 10 or lower
  • Keep maxItemsPerHighlight at 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.