All notable changes to this actor are documented here.
- A busy moment is waited out, not retried in lockstep. When many runs ask for Instagram data at once, a request used to be asked again at fixed moments, so runs that were turned away together came back together. Each request now waits its own turn, spread out, and never past the run's own timeout. A dropped connection or a temporary error is asked again before anything is given up.
- The note for an account that could not be read in time now says exactly that, in plain words. It is still not charged.
- Every highlight you ask for is now opened. Only the first highlight of each account was being opened. The rest came back as rows saying they "could not be opened this time — try again", and running again gave the same result. Now every highlight up to "Max highlights per account" is opened. Each opened highlight is one paid event ($0.0125), as in the pricing table, so a run that asks for several highlights per account now returns all of them and is charged for each.
- An account with no highlights now says so. It used to come back as a temporary error with advice to try again in a few minutes, which could never help. It now comes back as "The account has no highlights pinned to its profile." and counts as one account read ($0.010) — the same as any other account whose highlights turn out to be empty.
- Runs on a paid Apify plan now get the paid plan's limits. Every run was treated as a free-plan run, whatever plan it ran on: at most 8 accounts per run, at most 2 highlights opened on each, and the picture read on at most 3 frames. A paid run now reads as many as your settings ask for, and a first paid run with nothing else to report leaves a short note on what the paid plan lifts.
- Rows from a highlight link now carry the account name and a working link to each item. When a run started from a highlight link, or from a short share link to a highlight, every row said "N/A" for the account, and each item's link had "N/A" where the account name belongs, so it opened nothing. Both now name the account the highlight belongs to.
- The free plan's monthly run count is now kept for this actor on its own. Free runs of this actor count toward its own allowance of 15 runs a month, separately from any other actor you use, starting from this build.
- Mode 3 now opens highlight links. A link like
instagram.com/stories/highlights/… used to come back as an account that "could not be reached", even though the input form accepts highlight links. It now returns the items inside that highlight, charged as one opened highlight — no account charge, because no account is read. A short /s/ share link that points at a highlight is opened the same way.
- Story IDs and item links from highlights are now exact. Instagram's long item IDs were being rounded on the way in, so an item's ID and link could point at the wrong item.
- A run that could not read some accounts because of a temporary error now says so. Before, when a few accounts failed and the rest came back, the run ended as a plain success. Now its note names how many accounts were not read, that they were not charged, and that re-running just those accounts usually works.
- The input form and the README now say what each kind of link returns.
- Clarified wording in the README, the input form, the output column and storage record descriptions, and an earlier changelog entry. Nothing changes in how the actor runs, what it returns or what it costs.
- Clearer wording when nothing could be scraped. The end-of-run note no longer says "Nothing was charged" on runs where some accounts were read and then rejected by your filters — reading is what the charge is for, so the note now says which part was charged and which wasn't.
When a run cannot finish, it now says so in one plain sentence instead of passing along
raw error text. Input fields, output columns, defaults and pricing are unchanged from 0.0.1.
First build. Reads the stories an Instagram account has live right now, and the highlights it
keeps pinned to its profile.
Three modes: live stories by account name, highlights by account name, and a start-from-a-link
mode for a story or highlight you already have.
Every account you submit comes back as a row, including the ones with nothing to show. An account
with no story up right now says exactly that — stories are live for 24 hours, so an empty answer
is usually the true one rather than a failure. Reading an account costs the same whether or not
something is up, so that account counts as one read. Private accounts, misspelled names and
accounts that no longer exist each return their own row with the reason, and none of those is
charged at all.
For each story item you get the picture or video, when it was posted and when it expires, plus the
link stickers, @mentions, hashtags, location and music where the story carries them. For
highlights you get the highlight itself — cover, title, creation date, item count — and, if you
ask for it, every item inside.
The words on the picture. Instagram publishes a story's stickers, mentions and music as data,
but not the caption the author typed over the photo. This build reads the picture itself and fills
in four more columns: the text baked into it, one sentence about what it shows, the brands visible
in it, and the language of the text. On 32 frames out of 66 we measured, Instagram returned no text
field of any kind while the picture carried a whole paragraph.
It is a switch, and it is on by default. Turning it off leaves every other column exactly as it is.
Each frame that comes back readable is charged; a frame skipped by a cap, too large to send, or
unreadable arrives without those four columns and is not charged, with the reason named in its own
column rather than left blank. The default per-account ceiling is three frames, newest first. On the
free plan three frames per run are analyzed in total — the results say so on every other row.
Five more things in that output are worth naming, because they are the reason to read stories at all
rather than posts:
- The post a story is promoting. About two stories in five are a reshare of a reel or a post,
and you get its permanent link — stories expire in 24 hours, the post does not. You also get
whether it is the account's own post or someone else's. Most are someone else's, which makes
this a map of who an account amplifies: collaborations, barter, affiliate pushes.
- Where a link sticker actually goes. Instagram publishes two versions of every link: a
redirector, and a display copy that is lowercased and stripped of its query string. On short
links the capitals matter, so the display copy can be a dead link. This actor gives you the real
destination, with Instagram's own click-tracking removed, and keeps the redirector beside it.
- Whose sound it is. A story either carries a licensed track or a sound the account recorded
itself — and the second is how trends start. You get which of the two it is, who first published
an original sound, how far into the sound the story begins, and whether the credit sticker was
hidden from viewers.
- Who the account is. Display name, verified badge and the size of the original upload come
back on every row, so a list of handles reads as a list of people and brands without a second
lookup.
Leave the accounts field empty and the run does a small, capped demo so you can see the shape of
the output before spending anything. It says so in the results.