Audio & video transcription: never charged for a link we can't reach, can't decode, or that has no speech. Any audio or video URL to text, SRT and VTT with timestamped segments — direct file links from any host, plus 14 tested sites for page links. About 90 languages, no API key of your own.
Any direct audio or video file link, from any host (.mp3, .m4a, .wav, .mp4, .mov, .webm …), for example https://example.com/episode.mp3, or a page link on one of the 14 tested sites named in the description above — including an X (Twitter) post link, x.com//status/. Files over 256 MB come back as an uncharged row — send the audio-only version. YouTube, Instagram, LinkedIn ads, TikTok Creative Center, Google Ads Transparency Center and Facebook Ad Library links belong in their own steadyfetch actor and come back uncharged naming it. Long meeting and conference recordings are the ones that cross the size limit, and an audio-only version of the same session is usually far smaller. For your own media this field needs a real value — every other field accepts null, meaning "use the default". Leave it empty with nothing else set and the run transcribes a fixed 25-second public-domain sample clip (charged like any run: one audio minute) — the fastest way to see real output, and leaving it empty with only the options below set runs that same clip under them.
Type:array
Default:
[]
Podcast feeds or show links
podcastUrls
Optional
A whole podcast show per line: an RSS feed address such as https://example.com/feed.xml, or an Apple Podcasts SHOW link such as https://podcasts.apple.com/us/podcast/name/id1200361736 (the show page, not an episode — an episode link carries ?i= and belongs in "Media URLs"). The newest episodes are read from the feed and transcribed, newest first, as many as "Episodes per show" allows. Never charged: a feed we cannot reach, a link that is not a feed, a show Apple does not list, and any episode this account already had — each comes back as an uncharged row naming what was found. Leave it empty and nothing here runs; the actor's own field for single files and episode pages is "Media URLs" (urls).
Type:array | null
Default:
[]
Episodes per show
maxEpisodesPerShow
Optional
How many of each show's newest episodes to transcribe, for example 10 for the last ten. Never charged on its own — it only decides how many episodes the run plans, and a show with fewer episodes than this delivers all it has and says so. Applies to "Podcast feeds or show links" only; links in "Media URLs" are unaffected. One run goes up to 500 episodes per show, and asking for more continues at 500.
Type:integer | null
Minimum:1
Default:10
Dataset ID (chain a scraper run)
datasetId
Optional
The default dataset ID of a finished scraper run. With Apify's 'Connect actor' integration this is filled automatically — the cleanest way to chain. One media link per row is transcribed; a link that is already in "Media URLs" is never transcribed twice.
Type:string | null
Dataset items (paste rows)
datasetItems
Optional
Paste rows from a scraper run instead of chaining by ID. The actor deep-scans each row for an audio or video link — works with any scraper's output shape, including nested posts. Thumbnails, covers and profile pictures are never mistaken for media.
Type:array | null
New items only
newItemsOnly
Optional
OFF (default): every link runs as usual; an item your account already has comes back from the earlier run, not charged (repeat: true), so a re-run of the same list is a complete archive that only pays for what is new. ON: items already delivered to your account are left out of the dataset entirely — nothing fetched, nothing charged, and the run’s status line says how many were skipped — so a scheduled run hands your integration only the new episodes. Only an item this actor actually delivered a transcript for counts; an item that came back without one — unreachable, no speech, or stopped by a cap — does not, so the next run tries it again.
Type:boolean | null
Default:false
Formats to return
outputFormats
Optional
All four are returned by default — plain text, timestamped segments and ready-made SRT and VTT subtitle files — at no extra cost. Trim the list if you only want some of them; plain text is always returned.
Type:string[] | null
Default:
[
"text",
"segments",
"srt",
"vtt"
]
Language hint
language
Optional
Leave as "auto" to detect the spoken language automatically (about 90 languages are supported). Otherwise give a two-letter ISO 639-1 code such as en, es, de, ja, ar. On a run with no links the sample clip is an English recording, so a hint naming another language is answered with an uncharged row rather than transcribed into words that are not in it.
Type:string | null
Default:auto
Max minutes per item
maxMinutesPerItem
Optional
Skip any single item longer than this many audio minutes. 0 means no per-item limit. Skipped items come back as uncharged rows saying how long they were. One run goes up to 100,000 minutes per item; ask for a bigger number and the run continues at that, and says so.
Type:integer | null
Minimum:0
Default:0
Max total minutes
maxTotalMinutes
Optional
Stop the run once this many audio minutes have been charged in total. 0 means no limit. The run stops cleanly and the items it did not reach come back as uncharged rows. One run goes up to 1,000,000 minutes in total; ask for a bigger number and the run continues at that, and says so.