For an Instagram story download API inside an app or agent, Scavio is the quickest to wire in: POST /api/v1/instagram/user/stories takes a public username and returns every live story with a direct image or video URL in about 2 seconds. Scavio starts from $2 per 1,000 requests; a story check is usually 8 credits, so $16 per 1,000 accounts checked on the Growth plan billed yearly. If cost per account is what decides it, HikerAPI and the datavoyantlab Actor on Apify are far cheaper; if you need highlights, use HikerAPI or the goat255 Actor; for a handful of accounts with no code at all, use our free Instagram story downloader.
We build Scavio, so that recommendation comes with an obvious bias. To keep it honest: every price below was read off the vendor's own page on October 8, 2026, every Scavio response in this post is a real capture from that day, and the section on Scavio lists what it does badly. Per account checked, Scavio costs five to ten times HikerAPI on the Growth plan billed yearly and is the most expensive tool here by a wide margin at pay as you go; it also has no highlights endpoint.
Two ground rules before the tools. Stories expire 24 hours after posting, so every tool here returns only what is live at the moment you ask. And every tool that reads other people's stories works only on public accounts: a private account's stories are visible to its approved followers and nobody else, and nothing in this post gets around that. What you do with the media afterwards is governed by the creator's rights, not by the API that fetched it.
Which Instagram story API fits your job?
| Tool | Choose it for | Uses your Instagram login? | Highlights | Price (checked Oct 8, 2026) | Main thing to check |
|---|---|---|---|---|---|
| Scavio | Live stories in one synchronous call inside an app or agent | No | No | Starts from $2 per 1,000 requests; a story check is usually 8 credits, so $16 per 1,000 checks on the Growth plan billed yearly, $80 pay as you go | No captions or view counts, no highlights, 5 to 10 times HikerAPI per check |
| HikerAPI | Lowest cost per account, plus highlights and single-story lookup | No | Yes | 2 to 3 billed requests per call; $1 per 1,000 requests, $0.60 at volume | Each call bills more than one request |
| Apify Actors | Batch runs over a username list, with timestamps | No | Yes (goat255 Actor) | $3 per 1,000 usernames (datavoyantlab); from $3 per 1,000 stories (goat255) | Third-party Actors, maintained by their authors |
| SocialCrawl | Stories with published_at in a schema shared across platforms | No | Yes, list plus a detail call | 5 credits per stories call; £49 for 20,000 credits | Prices in GBP; highlights take two calls |
| instaloader | Free downloads for a few accounts | Yes, required for stories | Yes | Free, open source | Your account carries the risk |
| Official Instagram API | Stories on professional accounts you manage | Your business login, via a Facebook Page | No | Free per call | Cannot read other people's stories |
How often you check matters more than which tool
A story you did not fetch within 24 hours is gone, so the real unit of cost is not one call but one account checked often enough to miss nothing. In our sample the oldest live story was 22.7 hours old and the newest 0.4 hours, so an account that posts through the day needs at least one check every 24 hours, and two if you cannot afford a gap.
That turns pricing into multiplication: accounts times checks per day times 30. At 100 accounts checked twice a day, you make 6,000 calls a month. Here is what one check of 1,000 accounts costs at list price, which you then multiply by your schedule:
| Tool | Billing unit | Cost per 1,000 accounts checked |
|---|---|---|
| HikerAPI | 2 to 3 requests per call | $2 to $3 ($1.20 to $1.80 at the volume rate) |
| Apify, datavoyantlab Advanced Instagram Stories Scraper | Per username | $3, plus $0.099 per run |
| Apify, louisdeconinck Instagram Story Details Scraper | Per profile | $17 to $20, plus $0.07 to $0.10 per run |
| Apify, goat255 Stories & Highlights Scraper | Per story returned | About $20 to $22 at our sample's 6.5 stories per account |
| SocialCrawl | 5 credits per call | £12.25 on the Growth pack, £30 on Starter |
| Scavio | Usually 8 credits per call, 10 on some | $16 to $20 on the Growth plan billed yearly, $80 to $100 pay as you go |
Billing on empty accounts differs too. Per-account pricing charges for a check whether or not anything is live: Scavio billed 8 credits for our one account with no stories up. Per-story pricing such as goat255's charges nothing for stories that are not there. If most of your list is quiet most days, per-story billing wins.
What a live story check returns, measured
To see what the job looks like in practice, we checked eight public accounts likely to have stories up (sports leagues and clubs, news, a brand, a science agency and a creator) through Scavio at 11:11 UTC on October 8, 2026, then fetched every media URL it returned.
Seven of eight accounts had stories live, 52 items in all, and the mix varied more than we expected: CNN's 12 were all photos, ESPN's 8 all video. Every one of the 52 media URLs answered HTTP 200 when we fetched it, photos as full-size portrait JPEGs (1170 by 2080 pixels on the CNN story we opened) and videos as MP4 (the first NBA video was a 13 MB file). The median call took 2.1 seconds and the slowest 3.8.
Two findings shape how you build on this:
- The links expire, separately from the story. Each media URL is signed with an expiry stamp. On our capture, video links expired 32 to 36 hours out and photo links 104 to 108 hours out. Download the file when you fetch the story; do not store the URL and expect it to work next week.
- Posting and expiry times come with every story.
taken_atandexpiring_atare unix seconds, and expiry is exactly 24 hours after posting, so you can schedule the next check per account instead of polling blind. On our capture the 52 stories ranged from 0.4 to 22.7 hours old.
1. Scavio for live stories inside your app
Scavio is a REST API, so it fits when stories feed code: a brand-monitoring job, a creator research agent, an archive of your own campaign's tagged partners. It reads public data and never asks for your Instagram login. Stories are one of 12 endpoints on the Instagram API, and the same key covers Google, TikTok, YouTube, Reddit and the rest.
| Endpoint | Returns | Credits |
|---|---|---|
/api/v1/instagram/user/stories | Every live story for a username or user ID, with media URLs | Usually 8 (2 to 10) |
A check and a download is one request plus one fetch per item:
import os
import requests
r = requests.post(
"https://api.scavio.dev/api/v1/instagram/user/stories",
headers={"Authorization": f"Bearer {os.environ['SCAVIO_API_KEY']}"},
json={"username": "nba"},
timeout=90,
)
for story in r.json()["data"]["items"]:
url = story["video_url"] if story["is_video"] else story["thumbnail_url"]
ext = "mp4" if story["is_video"] else "jpg"
with open(f"{story['shortcode']}.{ext}", "wb") as f:
f.write(requests.get(url, timeout=60).content)And the response, trimmed to one video item with the signed URLs shortened:
{
"data": {
"items": [
{
"id": "4002737224843607694_20824486",
"pk": "4002737224843607694",
"shortcode": "DeMlExwCT6O",
"media_type": 2,
"is_video": true,
"story_type": "video",
"thumbnail_url": "https://scontent-lga3-2.cdninstagram.com/v/t51.71878-15/840101993_..._n.jpg?...",
"video_url": "https://scontent-lga3-3.cdninstagram.com/o1/v/t2/f2/m78/AQNqcMEn....mp4?...",
"taken_at": 1791383482,
"expiring_at": 1791469882,
"caption_text": null,
"view_count": null,
"owner": { "pk": "20824486", "username": "nba", "full_name": "NBA", "is_verified": true }
}
],
"count": 17
},
"response_time": 2714,
"credits_used": 10
}An account with no live stories returns "items": [] and "count": 0 rather than an error. The same items are repeated under a reels object keyed by the account's numeric ID, which you can ignore.
What Scavio does badly, from the same day's testing:
- It costs five to ten times HikerAPI per check. A check usually costs 8 credits (six of our eight calls billed 8, two billed 10), so 1,000 accounts cost $16 to $20 on the Growth plan billed yearly, in the range of the pricier Apify Actors, and $80 to $100 pay as you go, the most expensive option here. HikerAPI does the same check for $2 to $3.
- No captions or view counts.
caption_textandview_countcome backnullon every story item. - No highlights. There is no highlights endpoint; HikerAPI, the goat255 Actor, SocialCrawl and instaloader all have one.
- Empty checks are billed. Our Nike call found no live stories and still cost 8 credits.
- No stickers, links, mentions or music. You get the media and the owner, not the interactive layer of the story.
What the price buys is a synchronous call with no run to start and no dataset to poll, one response shape shared with every other Scavio endpoint, and an MCP server so an agent can call it directly. For a few accounts by hand, the free story downloader and story viewer run on this endpoint and need no key; both work on public accounts only.
2. HikerAPI for the lowest cost per account
HikerAPI is an Instagram-only API with the deepest story coverage in this list. Its API reference has endpoints for a user's stories by ID or username, a single story by ID or URL, a story media download, a user's highlights and a highlight by ID. The reference marks the billing on each: 2 requests per call for stories by user ID, 3 by username. Pricing is pay per request, $1 per 1,000 on the popular plan and $0.60 per 1,000 at volume, with 100 free requests and no subscription.
That makes it the cheapest paid option for checking stories on a schedule, at a fifth to a tenth of Scavio's Growth-plan price per check. Check what counts as a billed request on each endpoint you use, since the multiplier is per endpoint.
3. Apify Actors for batch runs and highlights
Apify is a marketplace of scrapers called Actors, and stories have more than a dozen. Two stand out for this job:
- Advanced Instagram Stories Scraper by datavoyantlab, the story Actor with the most monthly users (374, of 1,907 total, rated 4.72). It takes a list of usernames, needs no login, and returns
taken_at,expiring_atand the media URLs. It costs $3 per 1,000 usernames plus $0.099 per run. - Instagram Stories & Highlights Scraper by goat255, for highlights. It returns the live tray and every item inside each highlight, with
takenAt,expiringAt, music and stickers. It charges per story returned, from $3 per 1,000 stories ($3.45 on Apify's free plan), so expanding a creator's highlights can cost far more than their live stories.
The most-installed story Actor overall, louisdeconinck's Instagram Story Details Scraper with 2,046 users, charges $0.017 to $0.02 per profile, several times the datavoyantlab rate. As with any Actor, the author maintains it, not Apify; pin the one you tested and re-check it when Instagram changes.
4. SocialCrawl for timestamps in a shared schema
SocialCrawl's stories endpoint takes a handle or user ID and returns media URLs, duration and a published_at capture time, at 5 credits per call; a separate story-download endpoint fetches one known story, also at 5 credits. Highlights are a 1-credit list call plus a detail call per highlight for the items. Credit packs are £15 for 2,500, £49 for 20,000 and £299 for 150,000, one-time and never expiring, with 100 free credits. Its pricing page also says credits are refunded when a page comes back empty. Choose it if you already read other platforms through it and want one schema.
5. instaloader for free downloads
instaloader is the most popular open-source Instagram downloader: 13,519 GitHub stars, MIT licensed, latest release v4.15.3 in July 2026. It downloads stories and highlights with --stories and --highlights, and its command line docs mark both "Requires login". You run it on your own Instagram session, so Instagram's limits apply to your account. Fine for a few accounts from a laptop; at volume, your account is what absorbs the consequences.
6. The official Instagram API for accounts you manage
Meta's API does have a stories edge, GET /{ig-user-id}/stories, and it is the only sanctioned way to read story data. It works on professional accounts you manage: the token needs instagram_basic and pages_read_engagement through the Facebook Page linked to the account. Meta lists its limits plainly: "Stories are only available for 24 hours", live video stories are not included, and reshared stories are not returned. Business discovery, the official route to other accounts, returns profile and media metrics, not stories. If the stories are yours or a client's, use this and archive them before they expire; for anyone else's, it has nothing to offer. Our post on the Instagram API without OAuth walks through where Meta's login is and is not required.
What to check before buying volume
- Run your own list on the free tier. Stories vary wildly by account; we saw 17 on one and none on another. Ten of your real targets tell you more than any vendor's sample.
- Normalize to cost per account checked. Per request, per credit, per username, per story: convert each to 1,000 checks, then multiply by how often you must check.
- Whether empty checks are billed. On a quiet list, this can be most of your bill.
- Timestamps and expiry. If you need to know when a story went up, confirm the field is populated, not just present in the schema. Ours carries both on every item.
- How long media URLs last. Fetch the file immediately. Signed links in our test lasted 32 to 108 hours.
- Highlights cost. A creator with dozens of highlights can turn one per-story-billed run into hundreds of billable items.
Frequently asked questions
Is it possible to download someone's IG stories? Yes, if the account is public and the story is still live. Stories disappear 24 hours after posting, and a private account's stories are visible only to approved followers, which no legitimate tool gets around. For a public account, an API such as Scavio's returns each live story's image or video URL for direct download; what you do with that media is still subject to the creator's rights.
How to bulk download Instagram stories? Send a list of public usernames to an API or Apify Actor that returns media URLs, then download each URL straight away. Run it at least once a day, because a story you miss is gone after 24 hours. The signed links expire too: in our test, video links lasted 32 to 36 hours.
Is there a free Instagram Downloader API available? Not without limits. instaloader is free and open source but needs your Instagram login for stories and highlights. HikerAPI gives 100 free requests, SocialCrawl gives 100 free credits, and Scavio gives 50 free credits, enough for five or six story checks.
Does Instagram allow data scraping? No. Instagram's Terms of Use prohibit collecting information in an automated way without Instagram's express permission, whether or not you are logged in, so every third-party story tool runs against that clause. The only sanctioned route to story data is the official API, which covers professional accounts you manage. This is not legal advice; copyright in the media and personal data laws such as GDPR matter as much as which tool you pick.
Skip the story pipeline maintenance
If you build this yourself, you own the parts this post kept running into: a schedule that never lets an account go 24 hours unchecked, a downloader that grabs each file before its signed link expires, a store keyed on story ID so you do not save the same item twice, and a record of what you already downloaded, since each story disappears 24 hours after posting.
Scavio absorbs the fetching half of that. You send a username and get the same JSON shape every time, with no Instagram account involved and nothing to keep patched. Scavio starts from $2 per 1,000 requests on the Growth plan billed yearly; a story check is usually 8 credits, so $16 per 1,000 checks. It is not the cheapest per check, so price it on your schedule: checking 25 accounts once a day for 30 days is 750 calls, 6,000 to 7,500 credits, which the Project plan at $30 a month for 7,000 credits nearly covers; pay as you go at $0.01 a credit, the same month costs $60 to $75.
Get an API key with 50 free credits, no card required, and run the stories endpoint on your own list before you decide.