Instagram Stories Scraper — Instagram Highlights, No Start Fee avatar

Instagram Stories Scraper — Instagram Highlights, No Start Fee

Pricing

from $8.00 / 1,000 story checks

Go to Apify Store
Instagram Stories Scraper — Instagram Highlights, No Start Fee

Instagram Stories Scraper — Instagram Highlights, No Start Fee

Instagram stories for any public account: media links, mentions, hashtags, link and poll sticker types, and when each story expires. No login. Saved highlight albums too if you ask for them, at $0.012 per album. From $8.00 per 1,000 story checks, no start fee. An empty account is never charged.

Pricing

from $8.00 / 1,000 story checks

Rating

0.0

(0)

Developer

Steadyfetch Team

Steadyfetch Team

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Type the Instagram accounts you want and get the stories they are showing right now, and — if you ask for them — every item inside their saved highlight albums. Media links and when each link stops working, mentions, hashtags, outbound link stickers, poll and question sticker types, and the exact moment each story expires. No login, no cookies, no proxy to configure. There is no start fee, and an account with nothing showing is never charged.

Using an AI agent? Pin this actor in Apify's MCP server with one link: https://mcp.apify.com?tools=steadyfetch/instagram-stories-highlights-scraper

  • Actor id: steadyfetch/instagram-stories-highlights-scraper
  • Input: { "usernames": ["nasa"], "includeHighlights": true } — the one field you have to set is usernames.
  • Cap the bill: set maxTotalChargeUsd on the run (a run option, not Actor input), e.g. 0.50 — the run stops when it reaches it.
  • Price: from $8.00 per 1,000 story checks on Gold and above, $16.00 per 1,000 on the Apify free plan — one charge per account, covering every story that account is showing; a highlight album is a flat $0.012. No start fee, and an account showing nothing is never charged. Full table below.
  • How often it changes: stories expire in 24 hours, which is what makes this a scheduled job rather than a one-off — run it daily and you catch what would otherwise be gone, and the quiet days cost nothing because an account with nothing showing is never charged. Highlights barely change at all: read them once, then only when you have a reason to look again.

What you get

One row per story or highlight item. kind says which, and both kinds carry the same columns, so it is one table you can sort rather than two shapes to reconcile:

ColumnWhat it holds
kindstory (showing now) or highlight (saved to the profile)
username · userFullName · userIsVerified · userIdwhose it is
highlightTitle · highlightId · highlightCreatedAtthe album this item lives in (empty for a live story)
takenAtwhen it was posted, ISO-8601 UTC
expiresAtwhen this story disappears — 24 hours after takenAt (empty for a highlight, which does not expire)
mediaType · isVideo · videoDurationimage or video, and how long the video runs
displayUrl · videoUrl · mediaUrlExpiresAtthe media links, and exactly when each signed link stops working
mentions · hashtags · linksthe @handles, tags and outbound URLs on the story, link stickers included
stickerTypes · isSponsored · locationNamepoll, question, music, GIF and countdown stickers; paid-partnership flag; place
shortCode · mediaIdthe item's own identifiers
charged · status · statusReasonwhether this row was billed, and why, so your invoice reconciles from the dataset itself

Media links are signed and time-limited by Instagram: mediaUrlExpiresAt tells you exactly how long each one stays fetchable, so download what you need in the same session. The requesting network address is stripped out of every link before it reaches your dataset.

What a row looks like

One delivered row from a real run — @nasa, 2026-09-11. This row charges one stories-check: the account's whole set of live stories, however many there are. Media links are signed and time-limited by Instagram, so they are shown here as placeholders.

{
"kind": "story",
"mediaId": "3983283525835002608",
"shortCode": "DdHd0MtD5Lw",
"takenAt": "2026-09-10T18:20:20.000Z",
"expiresAt": "2026-09-11T18:20:20.000Z",
"mediaType": "video",
"isVideo": true,
"videoDuration": 15,
"displayUrl": "https://…",
"videoUrl": "https://…",
"mediaUrlExpiresAt": "2026-09-12T23:08:44.000Z",
"mentions": [],
"hashtags": [],
"links": [],
"stickerTypes": [],
"isSponsored": false,
"locationName": null,
"highlightId": null,
"highlightTitle": null,
"highlightCreatedAt": null,
"username": "nasa",
"userId": "528817151",
"userFullName": "NASA",
"userIsVerified": true,
"source": "instagram",
"input": "nasa",
"sourceIndex": 0,
"scrapedAt": "2026-09-11T13:04:04.138Z",
"charged": true,
"status": "delivered",
"retryable": false,
"statusReason": null,
"#k": "story:nasa:3983283525835002608",
"#ce": {"stories-check":1},
"#ask": {"delivered":1}
}

Price

Two charged events, and both land only on something actually delivered. Nothing is charged for starting a run.

stories-check — one charge per account whose stories question was answered, covering every story that account is showing. Two stories or twenty, it is one charge.

Apify planPer story checkPer 1,000 story checks
Free plan$0.016$16.00
Bronze$0.012$12.00
Silver$0.01$10.00
Gold and above$0.008$8.00 per 1,000

highlight$0.012 per album delivered, the same on every plan, covering every item inside that album. A 38-item album is one charge.

Platform usage is included in both prices — there is no separate compute bill on top, and no start fee. Set maxTotalChargeUsd on the run and it is a hard ceiling: the run stops cleanly under it and the last row says what is left.

Because charging is per GROUP rather than per row, exactly one row of each group carries charged: true and the rest say they are already covered by it. Add up the charged: true rows and you have your invoice.

Honest rows: what "not charged" actually means

Every run closes its own books. An account that gave less than it was asked for leaves an uncharged row saying which of these happened, and none of them is billed:

  • no_stories — the account is public, readable, and simply is not showing a story at this moment. Stories vanish 24 hours after they are posted, so this is a definitive answer about right now, not a failure. Not charged.
  • no_highlights — the account keeps no saved albums on its profile. A definitive answer.
  • private_account — Instagram shows this account's stories only to followers it has approved. Proved from the account's own privacy flag, not guessed from a failed read.
  • account_not_found — Instagram has no account under that name; it is misspelled, removed or renamed.
  • vendor_unavailable — the read did not go through. Temporary, says nothing about the account, and a re-run is the fix.
  • source_refused — Instagram would not answer for that handle at all, and it refuses it the same way every time, so a re-run cannot change it. Check the handle in a browser; if the account opens there, say so on the Issues tab.
  • unsupported_shape — Instagram answered in a shape this actor does not read yet. That is on us, not on the account, and a re-run gets the same answer — tell us on the Issues tab which account it was and support for it will be added.
  • stopped_at_limit / vendor_budget — one of your own limits, the run clock, or this actor's own collection allowance stopped it first. The row names which.

The last row of every run is a receipt: accounts answered, what was asked for, stories and albums delivered, what stopped the run, and the charged-event totals. A time limit ends the reading, never the delivering — rows already in hand are always written out.

How often this data changes

Stories change constantly and expire in 24 hours. An account posting daily shows something new most mornings and nothing at all on quiet days; an account that posts weekly is empty most of the time. That is what makes this a scheduled job rather than a one-off: run it once a day, or a few times a day on the accounts that matter, and you catch what would otherwise be gone. Because an account with nothing to show is never charged, a schedule over a quiet list costs you nothing on the quiet days.

Highlights barely change at all. An album is edited when its owner decides to edit it — often not for months. Read them once, then only when you have a reason to look again. Switch Highlights off on a daily schedule and leave it on for the occasional full sweep.

Reliability

The stories and highlights come from a licensed data feed rather than from scraping Instagram's own web pages, which is why there is nothing to log into and nothing to configure. When that feed cannot answer, the run says so on an uncharged row and finishes successfully — a failed read is never billed and never dressed up as an account with nothing to show.

Limits and good manners

Max accounts, Max highlight albums per account and Max run seconds take any number you type: this actor reads at most 1,000 accounts in one run, collects at most 50 albums from any one account, and runs for at most an hour (and for at least 30 seconds). A bigger ask runs at the ceiling instead of being refused, and one uncharged row says what was asked for and what was used.

Only public accounts can be read; a private account gets an honest uncharged row. Instagram itself decides what a logged-out viewer may see, so what comes back is what the account is showing publicly. This actor may stop working if Instagram changes how the data is served; if it does, items that cannot be delivered are never charged.

Support

Something off, or a column you need that is not here? Open an issue on the Issues tab — we usually reply within a couple of hours.

If it earned its keep, a rating helps other buyers find it, and saving the actor keeps it one click away.