- Clearer wording on uncharged no-speech rows: a reel whose audio turns out to be music-only or silent now says exactly that in
statusReason, in plain language. The same reels are recognised as before, and they are still never charged.
Silent reels can now be read from the screen, a run with no input shows a real transcript, and every row says whether it is worth re-running.
- New (optional, off by default): read the on-screen text of silent reels. About one reel in six is music-only, and its message is written on the screen rather than spoken. Switch on Read on-screen text on silent reels and those reels come back with that copy in a new
onScreenText field — headline, body, call to action and the full text — read from five frames of the reel the actor already downloaded, with no extra fetch and no new charge type: it is charged as one delivered transcript, at the same price. A silent reel with no readable text on screen stays uncharged, as before. Leave the switch off and nothing changes at all: music-only reels are never charged.
- A run with no input now returns a real sample row — a reel this actor transcribed on a verified run, with its transcript, 3-second hook, language and timestamped segments — instead of an example whose link had expired and returned nothing. Still uncharged, still fetches nothing.
- New
retryable column on every row. true when another run could plausibly return something different (a temporary wall, an expired link, a failure on our side), false when the answer is final (a private account, a reel Instagram will not expose, a delivered transcript). Re-run the rows worth re-running and leave the rest.
- New: Max run time (seconds). Bound a run's wall clock between 30 seconds and an hour, counted from when the run started. Reels still waiting come back as uncharged rows saying so.
- A creator who posts photos now gets a pointer to the actor that can serve them —
steadyfetch/instagram-profile-posts takes the same handle and returns those posts.
- When the speech service refuses our access mid-run, the remaining reels now each come back as an uncharged row naming the problem, instead of quietly missing from the results. They are still never fetched, and still never charged.
- A profile rescue that fails for a temporary reason now says so and asks for a re-run, instead of passing on a verdict that read as final for an account that a later run can deliver.
- Also in this build: a speech-service credit refusal now stops the run as cleanly as an access refusal (no reel pays for a download it cannot use); a brief CDN wall, timeout or rate-limit on a media link is reported as temporary and uncharged instead of "expired"; and an interrupted run that cannot re-read what it already delivered stops without charging rather than risking a second charge.
A creator Instagram's own profile service errors on can now still deliver their reels.
- A class of well-known public profiles now resolves instead of stopping at Instagram's service error. Instagram's profile lookup fails permanently on some large public accounts, answering every request with its own internal error, and runs for such a handle used to end with an honest but empty "Instagram's own profile service is returning an error" row. The actor now reads the creator's public profile page instead, confirms it belongs to the exact account you asked for, and continues to the reels as usual — transcripts deliver and are charged only as delivered. If the page cannot confirm the account either, the row you got before ships unchanged, still uncharged.
- The rescue never invents an answer. It runs only when Instagram's service errored or answered empty about a profile: a handle that genuinely does not exist, or a private account, keeps its definitive answer, and a page that serves a different account than the one asked for is refused.
A creator whose posts we could not finish reading is no longer reported as a creator who posts photos.
- When Instagram stops answering part-way through reading a creator's posts and no reels had been listed yet, the row now says the read was cut short and asks for a re-run — instead of reporting that the account posts photos. A creator whose posts we read all the way through, and who genuinely has no video, still gets that definitive answer.
- The run summary now counts a creator whose listing was cut short, so a partly-read run no longer reads as a complete one.
- Both rows are uncharged, as before.
- A typo in an input field name now gets a helpful pointer instead of sample rows. If you send a field this actor does not have —
profiles instead of handles, say — the run now returns one free row that names the field it did not recognise, names the one you meant, and shows the shape to send. Before, that run looked exactly like a run with no input at all and answered with the demo row, which made a typo look like it had worked.
- Rate-limit retries now reuse the media already in hand. When the speech service asks the actor to wait, the retry transcribes the bytes it already downloaded instead of fetching the reel again — retries are faster and cheaper, and a signed link that expired mid-run can no longer be misreported as permanently dead when the real cause was a brief wait.
- A speech-service access problem now stops the run honestly. If the speech service refuses this actor's access, the remaining reels are no longer processed one by one toward calls that cannot succeed: the run stops cleanly, the status line says how many reels were left and that the problem is on our side, and none of them are charged.
- Interrupted runs now resume without double-charging. If the platform moves a run to another server mid-batch (or you resurrect a finished run), the actor now recognises every reel it already delivered: nothing is fetched, delivered, or charged a second time, and any charge the interruption cut short is settled honestly. Before, a moved or resurrected run could deliver duplicate rows and charge again for reels you already had.
- A run's time ceiling now counts from when the run started, not from the latest restart, so an interrupted run can no longer live (and cost) longer than the ceiling promises.
- Long-video surcharge budgeting now also reserves for reels still being processed by parallel workers, so a batch of long videos near your maximum cost stops honestly instead of being cut off by the platform.
- Chaining from a mistyped or unreadable Dataset ID now returns one free row naming the ID and what to fix, instead of finishing quietly with an empty result.
- Every row's
charged flag and its chargeEvents ledger now match what the run could actually bill. On a run where no charge can be posted, a delivered transcript is reported as uncharged instead of claiming a charge that never happened, and long-video extra minutes are listed on a row only when those minutes were genuinely billed.
- If this actor's pricing is ever set up in a way that would bill you for the rows that are meant to carry no result fee — music-only, private, failed and demo rows — the run now stops before fetching anything, charges nothing, and says so, instead of quietly billing for them.
- A reel whose video file turns out to be oversized is now abandoned the moment it passes the size limit rather than downloaded in full, so it comes back sooner as an uncharged row and spends less of your run.
- Billing accuracy. A run with room left for exactly one more transcript now delivers it, instead of stopping one reel short of your maximum cost per run.
- A reel whose download arrives incomplete is retried, and if it still cannot be fetched in full it comes back as an uncharged failure — never a part-transcribed reel you were charged for.
- Long videos now reserve the right share of your maximum cost per run at the current prices, so a capped run no longer starts a long video it cannot pay to finish.
- The run summary reads correctly on a single-reel run — "1 reel", not "1 reel(s)".
- Price cut. A delivered reel transcript now costs $0.015 down to $0.005 depending on your Apify plan tier — the volume price was $0.010. The free-plan price and the $0.005 long-video surcharge are unchanged, and you are still charged only when a transcript lands in your dataset.
- The pricing block in this page now shows the new figures.
- Clearer store listing: the summary now finishes its promise — that music-only, private and failed reels are never charged — inside the space the store card actually shows, instead of being cut off mid-sentence.
- Added the plain statement that this is an unofficial tool, not affiliated with or endorsed by Instagram or Meta.
- The list of other steadyfetch actors at the bottom of this page now uses each actor's real, current name, and adds the Instagram profile-posts actor that is publishing shortly.
- New: transcribe a creator's reels by handle. Put
nasa, @nasa or a profile URL into Instagram creators and the actor lists that creator's most recent reels itself and transcribes them — no scraper, no dataset ID, no login. Choose how many with Max reels per creator (default 10).
- Rows from a handle now carry the post's date, plays, likes, comments, caption and thumbnail alongside the transcript, at no extra cost.
- A creator that cannot be read comes back as one uncharged row with the reason stated:
no_reels_found, private_account, not_found, or a temporary rate_wall that simply needs a re-run.
- If Instagram stops serving more reels part-way through a creator, the run keeps what it listed, says so in the run message, and charges only for transcripts it delivered.
- A reel supplied twice — listed from a handle and pasted as a link, or already present in a chained dataset — is delivered and charged once, and the freshest media link now wins, so a stale dataset row can no longer turn a live reel into an "expired" one.
- The README now opens with an Output section — a table of real rows from the live example run plus the full JSON row — so you can see exactly what you get back before spending anything.
- Added a copy-and-paste block for AI agents and LLM clients: the actor id, every input mode, all output fields, and the exact event prices.
- The live example dataset linked from the README is now permanent, so the link keeps working.
- New directory of the other steadyfetch actors — Facebook, Google Ads, TikTok and LinkedIn ad transcripts, plus Google Trends — with their free n8n templates.
- Billing and reliability fixes for pasted links: some valid reels were wrongly reported as expired and now transcribe; a pasted link now recovers the reel when a chained row's media link stops working; and a reel supplied both as a link and as a scraper row carrying only its page URL is charged once.
- Unusual link formats (missing
https://, mixed-case hosts) are accepted, and runs close to their time limit skip remaining lookups with uncharged retry rows instead of timing out.
- Paste Instagram reel links directly — no scraper needed. The new
reelUrls input takes plain instagram.com/reel/… / instagram.com/p/… links exactly as copied from the app; the actor resolves each reel's video itself and transcribes it immediately.
- Links that can't be resolved are never charged: private/removed posts come back as
private_or_removed rows and embed-restricted reels as resolve_blocked rows, each with the reason stated.
- A reel supplied both as a link and in a chained dataset counts as one billable reel, and keeps the best of both: the dataset row's creator and caption, plus the link as a fallback when that row's media URL has expired.
- Share links (
instagram.com/share/…) and mobile m.instagram.com links are handled properly — share links get a one-line guidance row instead of a misleading "removed post".
- Added a live example dataset to the README, alongside the ready-made n8n workflow.
- Billing accuracy: a reel with multiple quality variants counts as one billable reel; the same reel supplied more than once is delivered and charged once; long-video surcharge charges always respect the spend cap and match the per-row ledger; improved music-only detection (still never charged).
- Fixes:
maxItems now counts only transcribable reels, so free informational rows always ship; a bare console Run shows a friendly demo row; stricter download-size safeguards and sturdier transcription timeouts.
- Initial release: audio transcripts + first-3-seconds hooks for Instagram reels — chain a scraper run's dataset ID, paste dataset rows, or pass reel media URLs directly.
- Charged only on delivery: expired URLs, music-only reels, video-only streams without audio, and image posts arrive as uncharged rows with the reason stated. The first 3 minutes of each video are included; longer videos add a small per-started-minute surcharge.
- Every row carries
urlExpiresAt — the signed media URL's decoded expiry — so you can see whether a dataset is still transcribable before running it.