Instagram Story Downloader avatar

Instagram Story Downloader

Pricing

from $1.99 / 1,000 results

Go to Apify Store
Instagram Story Downloader

Instagram Story Downloader

Instagram Story Downloader saves public stories from any profile URL, returning username, story count and direct media links. πŸ“² Useful for competitor monitoring, content archiving, social listening and creator research.

Pricing

from $1.99 / 1,000 results

Rating

0.0

(0)

Developer

Scrapers Hub

Scrapers Hub

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

πŸ“Έ Instagram Story Downloader – Extract Public Story Media URLs, Video & Image Links

The Instagram Story Downloader collects the currently available public stories for one or more Instagram accounts and returns them as structured data: the account handle, how many stories were found, and an array of story media entries with their type and direct media URL. Supply Instagram profile URLs or bare usernames, and the actor produces one JSON record per account β€” suitable for social media monitoring, brand tracking, competitor research and archival workflows.

Instagram stories are ephemeral by design: they expire after 24 hours and leave no permanent public record. That transience is exactly why an Instagram story scraper is useful β€” if you are not capturing stories on a schedule, that layer of a brand's or creator's output simply disappears. This actor turns the currently live stories of a public account into a record you can store, timestamp and analyse.


πŸ“Š What Data Can You Extract with This Instagram Story Scraper?

Each account you submit produces a single flat record. The table below groups the real output fields by what they are used for.

CategoryFieldsWhat it gives you
πŸ‘€ Account identityusernameThe Instagram account handle the stories belong to, normalised from whatever URL or username form you supplied.
πŸ”’ Volume signalstories_countHow many story items were found for the account at the moment of the run β€” a direct measure of posting activity.
🎞️ Story mediastoriesAn array of story entries. Each entry carries the media type (image or video) and the direct media URL, with a thumbnail URL for video entries.
πŸ”— Input provenanceinputThe original URL or username you submitted, preserved so you can join results back to your source list.
⚠️ Run diagnosticserrorAn error message when an account could not be processed, returned instead of failing the whole run.

The field worth designing your pipeline around is stories_count. Because stories expire within 24 hours, the count captured at a given moment is a snapshot, not a total. Running the Instagram story scraper on a repeating schedule and logging stories_count at each pass builds a genuine posting-cadence time series that no single run can produce.


🌟 Key Features of the Instagram Story Downloader

FeatureDescription
πŸ”— Flexible account inputAccepts full Instagram profile URLs or plain usernames β€” both are normalised to a handle before processing.
πŸ“š Batch account processingSubmit a list of accounts in startUrls and the actor works through them in sequence, pushing each result as it completes.
🎬 Media type detectionEach story entry is classified as image or video, and video entries also carry a thumbnail URL.
βœ… Story URL validationExtracted media links are validated before being written out, so obviously malformed or non-Instagram URLs are filtered rather than stored.
πŸ” Retry with backoffFailed requests are retried with exponential backoff rather than abandoning the account on a first failure.
🌐 Automatic proxy handlingProxy rotation is handled for you, with an automatic fallback to residential addresses when a datacenter address is rejected.
🧯 Per-account error isolationIf one account fails, the failure is captured in that record's error field and the run continues with the remaining accounts.
πŸ“€ Streaming outputResults are pushed to the dataset as each account finishes, so partial results are available even if a long run is stopped early.
πŸ’³ Pay-per-event billingThe actor charges per result event. Check the Pricing tab on the Apify Store listing for current rates.

πŸš€ Why Choose This Instagram Story Downloader?

Structured data, not a download folder. The output is a dataset, not a pile of files. Each record ties an account handle to a story count and an array of media entries with types and URLs, which means the results are queryable, joinable and schedulable β€” the difference between a one-off download and an actual monitoring pipeline.

Failures are contained, not fatal. Instagram accounts fail for many ordinary reasons: the account went private, the handle was renamed, or there are simply no live stories right now. This Instagram story scraper writes an error message into that account's record and moves on, so a single problem account never costs you the other ninety-nine results in the batch.

Automatic proxy fallback. Proxy rotation is handled internally, and when a datacenter address is rejected the actor switches to residential addresses automatically before retrying. You do not have to diagnose or tune that behaviour yourself.

Built for repeat runs. Because stories vanish within a day, the value is in cadence rather than any single execution. The actor pushes results as it goes, works from a simple account list, and slots directly into an Apify schedule so you can capture a daily or hourly snapshot without manual intervention.


πŸ“₯ Input

The Instagram story downloader takes a list of Instagram accounts and an optional proxy configuration.

{
"startUrls": [
{ "url": "https://www.instagram.com/neymarjr/" }
],
"proxyConfiguration": {
"useApifyProxy": true
}
}

πŸ”§ Instagram Story Downloader Input Fields

FieldTypeRequiredDefaultDescription
startUrlsarrayβœ… Yesprefilled with [{ "url": "https://www.instagram.com/neymarjr/" }]One or more Instagram profile URLs (for example https://www.instagram.com/username) or plain usernames. Rendered with the request-list editor, so each entry is an object with a url key.
proxyConfigurationobject❌ Noprefilled with { "useApifyProxy": true }Proxy settings for the run. If the selected proxy is rejected by Instagram, a residential proxy is used as a fallback.

πŸ’‘ Input Examples

A single account

{
"startUrls": [{ "url": "https://www.instagram.com/neymarjr/" }]
}

A monitoring list of several accounts

{
"startUrls": [
{ "url": "https://www.instagram.com/neymarjr/" },
{ "url": "https://www.instagram.com/nasa/" },
{ "url": "https://www.instagram.com/natgeo/" }
],
"proxyConfiguration": { "useApifyProxy": true }
}

Plain usernames instead of full URLs

{
"startUrls": [
{ "url": "nasa" },
{ "url": "natgeo" }
]
}

πŸ“€ Output

One dataset item is produced per submitted account. The record below is a real result from an actual run β€” in this case an account that returned no retrievable stories, which is a normal and common outcome given how quickly stories expire.

{
"input": "https://www.instagram.com/neymarjr/",
"error": "Expecting value: line 1 column 1 (char 0)",
"stories_count": 0,
"stories": []
}

A record for an account with live public stories follows the same shape, with username populated, stories_count greater than zero, and stories holding one entry per story item. Each entry carries its media type and media URL, and video entries additionally carry a thumbnail URL.

🧾 Instagram Story Downloader Output Fields

FieldTypeDescription
usernamestring | nullAccount handle or username the record refers to.
stories_countinteger | nullNumber of story items found for the account at run time.
storiesarray | nullStory entries collected for the account, each describing one story item's media type and media URL.
inputstring | nullThe original URL or username submitted for this record.
errorstring | nullError message, if the account failed to process.

Note that stories_count: 0 with an empty stories array is a legitimate result, not a malfunction. An account with no active stories at the moment of the run has nothing to return.


πŸ’» How to Use the Instagram Story Downloader (Step by Step)

Step 1: Build Your List of Instagram Accounts

Decide which public accounts you want to monitor. These might be competitor brands, sponsored creators, accounts in an influencer campaign, or your own brand handles across regions. The Instagram story scraper accepts either full profile URLs or bare usernames, so you can paste whichever form your existing list already uses without reformatting it.

Step 2: Enter the Accounts in the Input Tab

Open the actor in the Apify Console and go to the Input tab. The Instagram Username or Profile URL field uses the request-list editor, so you can add entries individually or paste a batch. The field comes prefilled with a sample account you can replace. If you prefer raw JSON, switch to the JSON editor and supply the startUrls array shown above.

Step 3: Review the Proxy Configuration

The Proxy configuration field is prefilled to use Apify Proxy. Leaving it enabled is generally the right choice: Instagram is sensitive to request patterns, and the actor will automatically fall back to residential addresses if a datacenter address is rejected. There is nothing further to tune β€” the fallback behaviour is handled internally.

Step 4: Start the Run and Follow the Log

Click Start. The log reports each account as it is processed, showing the normalised username, the number of stories found, and any retries triggered along the way. Because results are pushed to the dataset as each account completes, you can open the dataset mid-run and see partial output rather than waiting for the whole batch.

Step 5: Read the Results, Including the Failures

Open Storage β†’ Dataset when the run finishes. Look at stories_count first to see which accounts were actively posting. Then filter for records where error is present β€” those tell you which accounts could not be processed and why, which is diagnostic information you would lose entirely if failures simply aborted the run.

Step 6: Retrieve the Story Media Promptly

Instagram story media URLs are short-lived. If you intend to archive the actual images or videos rather than just the metadata, fetch the URLs in the stories array soon after the run completes. Waiting hours before downloading frequently means the links have already expired at the source.

Step 7: Schedule Recurring Snapshots

Because stories expire within 24 hours, a single run only ever captures a moment. Attach an Apify schedule so the same account list is checked on a repeating cadence, and add a webhook on run success to push each snapshot into your own storage. Over time, the series of stories_count values per account becomes a posting-frequency dataset in its own right.


πŸ”Œ API Access & Integrations

Run the Instagram story downloader from the Apify API and get the dataset items back in one call.

curl -X POST "https://api.apify.com/v2/acts/scrapers-hub~instagram-story-downloader/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"startUrls": [
{ "url": "https://www.instagram.com/neymarjr/" },
{ "url": "nasa" }
],
"proxyConfiguration": { "useApifyProxy": true }
}'

The same run from Python using the official client:

from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run_input = {
"startUrls": [
{"url": "https://www.instagram.com/neymarjr/"},
{"url": "nasa"},
],
"proxyConfiguration": {"useApifyProxy": True},
}
run = client.actor("scrapers-hub/instagram-story-downloader").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
if item.get("error"):
print("Failed:", item.get("input"), "β€”", item["error"])
continue
print(item.get("username"), "has", item.get("stories_count"), "stories")
for story in item.get("stories") or []:
print(" ", story)

The actor also integrates with Zapier, Make, Google Sheets, Slack and generic HTTP webhooks, so story snapshots can be routed into a social media dashboard, a shared spreadsheet or a team notification channel automatically.


πŸ’‘ Best Use Cases for Instagram Story Data

🏷️ Brand and Competitor Story Monitoring

Track how often competitor brands publish stories by scheduling the Instagram story scraper against a list of their handles and logging stories_count at each pass. Comparing daily counts across a competitive set reveals who is investing in the story format, who posts in bursts around campaigns, and who has effectively abandoned the channel.

🀝 Influencer Campaign Verification

When a creator is contracted to post a set number of stories, the stories array and stories_count field provide time-stamped evidence that the content went live. Running the scraper across the campaign window and archiving each snapshot gives agencies and brands a verifiable record rather than relying on the creator's own screenshots.

πŸ“… Posting Cadence and Content Strategy Analysis

Because each run captures a point-in-time snapshot, a sequence of runs builds a cadence profile per account. Aggregating stories_count by hour of day across weeks shows when accounts in your sector actually publish, which is directly actionable when planning your own story schedule.

🎨 Creative Reference and Format Research

The stories array distinguishes image from video entries. Comparing that mix across a set of accounts tells you which formats a sector favours β€” heavy video use in one niche, static graphics in another β€” useful input when briefing creative teams or allocating production budget.

πŸ—„οΈ Ephemeral Content Archiving

Stories leave no permanent public record, which is a problem for compliance teams, brand archives and researchers. Scheduling the Instagram story downloader and preserving each snapshot's username, stories_count and media entries creates a durable archive of content that would otherwise be irretrievable within a day.

πŸ” Account Activity and Coverage Auditing

The error field turns the actor into a light account health check across a large handle list. Accounts that consistently return errors may have been renamed, set to private or deactivated β€” signals worth catching early when you maintain a large roster of partner, franchise or regional accounts.

πŸ“Š Social Listening Pipeline Enrichment

Story activity is a dimension most social listening tools ignore because the content disappears. Feeding username and stories_count into an existing listening dashboard adds a genuine engagement signal alongside feed posts and comments, giving a fuller picture of how active an account really is.


βš™οΈ Tips for Better Instagram Story Scraping Results

  • Schedule, don't sample. Stories expire within 24 hours. A single run tells you almost nothing about an account's behaviour; a scheduled run several times a day builds a dataset that does.
  • Keep Apify Proxy enabled. The proxy field is prefilled to use Apify Proxy for a reason. The automatic residential fallback only helps if proxying is switched on in the first place.
  • Fetch media URLs quickly. The links inside the stories array point at Instagram's CDN and do not stay valid indefinitely. Download promptly if you need the actual media rather than the metadata.
  • Only public accounts work. Private accounts expose nothing to anonymous visitors, so they will return errors or empty results regardless of how the run is configured. Filter your handle list to public accounts first.
  • Batch in moderate sizes. Long account lists take proportionally longer and are harder to retry. Splitting a large roster across several scheduled runs is more resilient than one very large job.
  • Always check the error column. Errors are written into records rather than raised as run failures. If you only look at successful rows, you will silently miss accounts that never got processed.

πŸ› οΈ Troubleshooting

Why did I get stories_count: 0 and an empty stories array? Most often because the account has no active stories at the moment of the run. Stories expire after 24 hours, so an account that posted yesterday morning may have nothing live now. Re-run at a different time of day before concluding anything is wrong.

What does the error Expecting value: line 1 column 1 (char 0) mean? That message indicates the upstream response could not be parsed as JSON β€” typically because the request was blocked, rate limited or returned an unexpected page instead of data. Retry with Apify Proxy enabled, and space out repeated runs against the same account.

Why does an account return an error every single time? Check whether the account is private, has been renamed, or no longer exists. The Instagram story scraper can only see what an anonymous public visitor can see, so a private account will never produce story data.

The media URLs in stories no longer work when I open them. Instagram story media URLs are time-limited. If you need the underlying files, download them immediately after the run rather than hours later. Storing only the URL and fetching it the next day will usually fail.

One account in my batch failed β€” did the whole run fail? No. Failures are isolated per account: the error is written into that record's error field and processing continues with the remaining accounts. Check the dataset for records where error is populated to see which handles need attention.


❓ Frequently Asked Questions About Instagram Story Scraping

What does the Instagram Story Downloader do? It takes a list of Instagram accounts, retrieves the stories currently available publicly for each one, and returns a record containing the account username, a stories_count, and a stories array of media entries.

What input does the Instagram story scraper need? A startUrls array containing Instagram profile URLs or plain usernames. An optional proxyConfiguration object controls proxy settings for the run.

Can I use just a username instead of a full profile URL? Yes. Entries are normalised to a handle, so nasa and https://www.instagram.com/nasa/ are both accepted.

Can I scrape stories from private accounts? No. Only content visible to an anonymous public visitor is accessible. Private accounts will return an error or an empty result.

How many accounts can I submit in one run? The input does not impose a fixed cap. Practical limits come from run duration, so very large handle lists are better split across multiple scheduled runs.

Does the Instagram story downloader save the actual image and video files? The dataset contains the story media URLs and their types rather than the binary files. Fetch those URLs promptly if you want to store the media itself, because the links expire.

How does proxying work for this actor? Proxy rotation is handled automatically, and when a datacenter address is rejected the actor falls back to residential addresses before retrying. The proxyConfiguration field lets you enable proxying for the run.

Why do stories disappear so quickly? Instagram stories are ephemeral by design and are removed 24 hours after posting. That is a platform behaviour, not a limitation of the scraper β€” it is precisely why scheduled capture matters.

How is this actor billed? It uses pay-per-event pricing and charges per result event produced. Consult the Pricing tab on the Apify Store listing for the current rate.

Can I tell whether a story was an image or a video? Yes. Each entry in the stories array records its media type, and video entries also include a thumbnail URL alongside the video link.

What is the input field for? It preserves exactly what you submitted for that record β€” the original URL or username. That makes it straightforward to join results back to your source list even when the handle was normalised along the way.

Can I schedule the Instagram story scraper? Yes, and you should. Apify schedules let you capture snapshots several times a day, which is the only way to build a meaningful picture of a channel where content vanishes within 24 hours.

Does a failed account stop the whole run? No. Each account is processed independently and any failure is recorded in that record's error field while the run continues.

What export formats are supported? Apify datasets export to JSON, JSONL, CSV, Excel, XML, HTML and RSS. JSON preserves the nested stories array intact, so it is the best choice for programmatic use.

How do I track how often an account posts stories? Run the actor on a schedule and log stories_count per account at each pass. The resulting time series is a direct measure of posting cadence that no single run can provide.


πŸ†˜ Support & Feedback

Encountered a bug or an account that consistently fails? Open a ticket on the actor's Issues tab with the exact handle and the input you used, so the behaviour can be reproduced and investigated.

Need a customised build β€” different output fields, direct media archiving, larger batch handling or a private version wired into your own monitoring stack? Email scraperhubapi@gmail.com and describe what you need.

If the Instagram Story Downloader is useful to you, please leave a review on the Apify Store. User feedback is what determines which improvements get built next.


βš–οΈ Disclaimer

The Instagram Story Downloader accesses publicly available data only β€” stories that Instagram displays to anonymous visitors on public accounts. It does not access private accounts, does not authenticate as any user, and does not circumvent access controls.

You are responsible for how you use the data this Instagram story scraper collects. Review Instagram's Terms of Service before running the actor, keep request volumes reasonable, and do not use the output in ways the platform prohibits.

Instagram stories contain personal data, and the media itself is copyrighted work belonging to the account owner. If you process data relating to individuals in the EU, UK or other regulated jurisdictions, you must comply with the GDPR and equivalent privacy laws β€” establish a lawful basis, minimise what you retain, honour data subject rights and delete data you no longer need. Downloading story media does not grant you any licence to republish, redistribute or commercially exploit it; obtain permission from the rights holder before reusing content.

If you believe data collected by this actor relates to you and you would like it removed, contact scraperhubapi@gmail.com with the relevant details and we will action your request.