Podcast Transcript Scraper — Audio & Video to Text, RSS & SRT avatar

Podcast Transcript Scraper — Audio & Video to Text, RSS & SRT

Pricing

from $3.00 / 1,000 audio minutes

Go to Apify Store
Podcast Transcript Scraper — Audio & Video to Text, RSS & SRT

Podcast Transcript Scraper — Audio & Video to Text, RSS & SRT

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.

Pricing

from $3.00 / 1,000 audio minutes

Rating

0.0

(0)

Developer

Steadyfetch Team

Steadyfetch Team

Maintained by Community

Actor stats

0

Bookmarked

99

Total users

87

Monthly active users

3 hours ago

Last modified

Categories

Share

Any media URL to text, SRT and VTT. Unreachable, silent and unsupported items are never charged. Direct file links always work; sites only where listed. Paste a link to an .mp3, .m4a, .wav, .mp4, .mov — or a podcast, SoundCloud, Loom, Twitch VOD, Archive.org or Wistia page, or a TikTok video link (tiktok.com/@<user>/video/<id>, a /t/ or vm.tiktok.com share link), a Facebook reel or watch link, or an X video transcript from a post link (x.com/<user>/status/<id>, twitter.com too) — and get back the transcript, the timestamps, and ready-made subtitle files. No account, no API key of your own, no subscription.

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

  • Actor id: steadyfetch/media-transcriber
  • Input: { "urls": ["https://example.com/episode.mp3"] } — the one field you have to set.
  • 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.

Just want to see it work? Click Start with nothing set and the run transcribes a fixed 25-second public-domain sample clip (the Gettysburg Address, read for LibriVox), charged like any run: one audio minute, $0.003. You get the text, the timestamps and the subtitle files on real audio. Paste your own links for a real run. Set only the options — a format, a minute cap — and no links, and the same clip runs under them, charged the same way, with one extra uncharged row naming which settings were yours. The one exception is Language hint: the clip is an English recording, so a hint naming another language answers with an uncharged row instead of inventing words.

Audio & Video Transcription input form in the Apify console: the media URLs list with the dataset chaining, output format and limit sections below it

You give itYou get back
A direct audio or video file link, from any hosttext — the full transcript, in the language it was spoken
…or a page link on one of the 14 tested sites belowsrt and vtt — subtitle files, ready to upload
…or a whole list of them in one runsegments — start/end timestamps for every line
…or the Dataset ID of any scraper run you already havelanguage, durationSeconds, wordCount, status, chargedMinutes

Pricing: $3.00 per 1,000 audio minutes — the same price on every Apify plan. You are charged per audio minute actually transcribed, rounded up to the next whole minute (a 90-second clip bills 2 minutes). Nothing else — no start fee, no subscription.

You never pay for the same item twice (the default sample aside — see the end of this paragraph). That memory is a key-value store in your own Apify account, so a run started with a scoped API token in restricted-access mode needs key-value store Read, Write and Create permission (or Actor runs set to Full access), under Settings → API & Integrations — without it this actor cannot open the memory at all, the run says so on its status line and on the first row of its dataset, and items you already have are transcribed and charged again (Write is what lets the run remember what it delivered; without it every run pays again). Every run remembers what it transcribed for your account — in a key-value store called media-transcriber-watch-account in your own Apify account — under the link you passed, under the file that link names, and, for a page link, the site's own id for the media. Re-run the same list and the items you already have come back from the run that delivered them: repeat: true, firstSeenAt, firstSeenRunId, nothing fetched, nothing decoded, nothing transcribed, nothing charged. It works across link shapes too — the same track pasted as a share link today and as its full permalink tomorrow is one item and one charge, and an episode reached through its page one day and pasted as its own audio address the next is likewise one item and one charge. Delete that store to forget everything; entries older than 90 days stop counting as repeats. If the store cannot be read on a given run, the run still runs: it transcribes and charges as usual, and says on the status line and the charged rows that the repeat check was unavailable — and when a token scope is what closed it, which permission to grant, on the status line and on the first row of the dataset. The one exception is the default sample — a Start with no links, or with only settings set: it transcribes our fixed 25-second clip live every time, is neither read from nor written to that memory, and is charged like any run (one audio minute), so a second bare Start pays for it again. Every run that names its own links, dataset or rows is covered exactly as above.

Run it on a schedule — pay only for new episodes

A podcast feed, a channel's uploads, a folder of recordings: the list grows, and this actor only ever charges the part that is new. Save your input as a Task, put the Task on an Apify Schedule (weekly suits most podcasts; daily for a show that posts daily), and add an integration or a webhook on run succeeded — a Google Sheet, Slack, n8n, Make, or your own endpoint. Every run remembers what it transcribed for your account for 90 days, so the episodes you already have come back marked repeat: true and are not charged again (a scheduled run on a scoped API token needs key-value store Read, Write and Create permission, or Actor runs set to Full access, or the memory cannot be opened and the episodes are charged again); turn New items only on and they are left out of the dataset altogether, so your integration receives only the new transcripts. Chaining works the same way: point datasetId at a scheduled scraper run's dataset and only the media links that run found for the first time are transcribed and charged.

What can fail, and what it costs you: nothing. The two most common non-deliveries are no_speech (the audio decoded fine but it is music, silence or a tone) and unsupported_site (a page link on a site outside the tested list below that does not plainly embed its media file). Both come back as a row with charged: false and a note saying what happened — as do unreachable, not_media, no_audio_stream, too_large, drm_or_paywall and budget_stop. You are billed for decoded audio minutes and nothing else.

Output

One JSON row per URL. Delivered rows carry the transcript and charged: true; anything that could not be delivered carries a status saying why, and charged: false. Every row also carries isNew (your account had never had this item before) and firstSeenAt; an item you already had comes back with repeat: true, firstSeenRunId and charged: false. Real rows from a verified run (long text trimmed with … for this page):

Dataset table of a real Audio & Video Transcription run: one row for a 25-second public-domain clip with its language, word count, transcript and source URL

statuschargedchargedMinutessiteNametitledurationSecondslanguagewordCounttext
oktrue1LoomSell Faster and Smarter with Loom53.45English118Ready to prospect more efficiently, close more pipeline, and create loyal champions? Loom …
oktrue9Archive.org1 Laying Plans - 2 Waging War506.78English1133Part 1. Laying Plans. Sun Tzu said, 1. The Moral Law 2. Heaven 3. Earth 4. The Commander …
no_speechfalse0WistiaWistia Product Page - Looping Header15.07nullnullnull

The last row is a music-only clip with no voice-over: it comes back with its metadata and is not charged.

Browse a full live example dataset → — one real run, three rows: a 3-minute public-domain recording transcribed and charged for 4 audio minutes, a music-only clip returned no_speech, and a dead link returned unreachable. The run charged 4 audio minutes in total — exactly the one row that carries a transcript.

A delivered row in full:

{
"url": "https://www.loom.com/share/3690d29d5e3c426eb0f7ea00f9d3ae7b",
"resolvedMediaUrl": "https://cdn.loom.com/sessions/transcoded/3690d29d5e3c426eb0f7ea00f9d3ae7b.mp4",
"sourceType": "site",
"siteName": "Loom",
"title": "Sell Faster and Smarter with Loom",
"durationSeconds": 53.45,
"language": "English",
"languageConfidence": null,
"text": "Ready to prospect more efficiently, close more pipeline, and create loyal champions? …",
"segments": [{ "start": 0.88, "end": 7.12, "text": "Ready to prospect more efficiently…" }],
"srt": "1\n00:00:00,880 --> 00:00:07,120\nReady to prospect more efficiently…",
"vtt": "WEBVTT\n\n00:00:00.880 --> 00:00:07.120\nReady to prospect more efficiently…",
"wordCount": 118,
"status": "ok",
"retryable": false,
"charged": true,
"chargedMinutes": 1,
"note": null
}

Every field is always present — explicit null over silent omission. Non-delivered rows carry a status and a note instead, plus retryable: true means the host refused us this time (a block, a throttle, a bot page) and running the same input again is worth it; false means the answer will not change.

statusWhat happenedCharged
okSpeech transcribed✅ per audio minute
no_speechAudio decoded, but it is music, silence or a tone
no_audio_streamThe file is video with no audio track at all
not_mediaThe link returns an image, a feed or a live stream — not a file. If a host served a web page where the file should be, that is a block: the row comes back retryable: true
no_mediaThe page resolved but exposes no audio or video we can fetch, or lists several files without saying which
unsupported_siteA page link on a site outside the tested list that does not plainly embed its media file (the note names the working route, and the actor that does handle it when one exists)
unreachable404 / 410 / DNS failure — permanent. A 401, 403, 451, throttle or timeout is a block, not a missing file: same status, retryable: true — unless the same 401/403/451 came back on every network route the run has, which carries retryable: false. That last row names its cause: a signed link whose own expiry stamp had already passed says it expired and tells you to re-run the scraper that made it, while a link with no stamp says the host is refusing the file to us and points you at its own feed or player
drm_or_paywallThe page streams only inside its own app (Spotify's open.spotify.com player, Amazon Music, Apple Music) or needs a signed-in account — there is no public file to fetch
too_largeOver the per-item size limit, or over your maxMinutesPerItem
asr_failed / failed_download / failed_resolveDid not complete after all attempts (also listed in the run's ERRORS record)
asr_unavailableOur speech-recognition service refused this actor's access mid-run — that is on us, not you. Remaining items were answered instantly without being started; try again later
budget_stopThe run hit your charge cap, your minute cap, or the run timeout before reaching this item
input_errorThe entry is not a usable link — the note says what to pass

This actor may fail when the platform changes things — failed items are never charged.

For AI agents & LLMs — copy this block

Actor: steadyfetch/media-transcriber (Apify Store)
Does: any audio/video URL -> transcript + SRT + VTT + timestamped segments.
One JSON row per URL. No login, no cookies, no third-party API key.
Run: POST https://api.apify.com/v2/acts/steadyfetch~media-transcriber/run-sync-get-dataset-items?token=APIFY_TOKEN
Input:
{
"urls": ["https://example.com/episode.mp3",
"https://archive.org/details/some_item",
"https://soundcloud.com/user/track"],
"datasetId": "aBcD1234efGh5678i", // optional, chain a scraper run
"datasetItems": [{"videoUrl": "https://cdn/clip.mp4"}],// optional, paste rows instead
"outputFormats": ["text", "segments", "srt", "vtt"], // optional, all four by default
"language": "auto", // optional, or an ISO-639-1 code
"maxMinutesPerItem": 0, // optional, 0 = no limit; up to 100,000
"maxTotalMinutes": 0, // optional, 0 = no limit; up to 1,000,000
"newItemsOnly": false // optional, true = leave items
// this account already had OUT
// of the dataset (scheduled runs)
}
Every optional field above accepts null, meaning "use the default" — so a
templated body can send the same shape every run. Only `urls` needs a real
value.
Output one row per URL: url, resolvedMediaUrl, sourceType, siteName, title,
durationSeconds, language, text, segments[], srt, vtt, wordCount,
status, retryable, charged, chargedMinutes, isNew, firstSeenAt,
repeat, firstSeenRunId, note
retryable=true on a non-ok row means the host blocked/throttled us —
re-run the same input. retryable=false means the answer will not change.
Chain datasetId takes the default dataset of ANY finished actor run. Each row is
deep-scanned for one audio/video link (videoUrl, audioUrl, mediaUrl,
playAddr, downloadAddr, a bare file link — at any depth); thumbnails,
covers and profile pictures are ignored. One media link per row, and a
link already in `urls` is never transcribed twice. Rows with no media
link are counted on the run's status line, never charged.
Pricing pay per event, platform usage INCLUDED, no start fee:
audio-minute-transcribed $0.003 per audio minute — the same price on every Apify plan
Billed per started minute, on decoded audio. Unreachable, silent, oversized and
unsupported items charge nothing at all.
Cap any run with maxTotalChargeUsd (minimum $0.05) or with maxTotalMinutes.
Repeats an item already transcribed for your account comes back from that run,
repeat:true + firstSeenRunId, uncharged — no fetch, no ASR. The memory
lives in your own key-value store media-transcriber-watch-account;
delete it to forget everything (90-day window). newItemsOnly:true drops
those items from the dataset instead, counted on the status line — the
shape a scheduled run wants. Either way they are never charged.
MCP: reachable through Apify's MCP server; ask for "speech to text from a URL".

What this does not do

  • No speaker labels. This returns one transcript per file with timestamps, not a who-said-what breakdown. If you need speaker separation, this is not the right actor.
  • No translation. Speech is transcribed in the language it was spoken. About 90 languages are detected automatically.
  • No downloading. You get text and subtitles, not a media file.

Paste a show, not an episode. Podcast feeds or show links (podcastUrls) takes either an RSS feed address — https://example.com/feed.xml — or an Apple Podcasts show link such as podcasts.apple.com/us/podcast/name/id1200361736, finds the feed itself, and transcribes the newest episodes. Episodes per show (maxEpisodesPerShow) decides how many; the default is 10, newest first. A show that publishes fewer than that delivers all it has and says so.

{ "podcastUrls": ["https://example.com/feed.xml"], "maxEpisodesPerShow": 5 }

Every episode lands as an ordinary row with its transcript, plus four columns the feed gave us: podcastShow, episodeTitle, episodeGuid and publishedAt. Those four are null on every row that did not come from a feed.

A re-run of the same feed only pays for what is new. Each episode is remembered by the feed's own id for it, so the next run hands back everything it has already transcribed for your account — repeat: true, not fetched, not charged — and transcribes only the episodes published since. That is what makes a weekly Task on one feed cost the price of one week's episodes rather than the whole back catalogue — as long as the token the Task runs under can open key-value stores in your account (Read, Write and Create), which a scoped token in restricted-access mode does not by default. Tick New items only and the repeats are left out of the dataset altogether, so a schedule delivers the new episodes and nothing else.

Nothing here is charged unless an episode is transcribed. A feed we cannot reach, a link that turns out to be a web page rather than a feed, a show Apple does not list, and a feed with no downloadable audio each come back as one uncharged row naming what was found and the next step.

One episode rather than a whole show still belongs in Media URLs (urls): an Apple Podcasts episode link (the one carrying ?i=), an episode page on any tested host, or the audio file itself.

Check this before you start, not after. A page link on a site that is not below comes back as an uncharged unsupported_site row — you lose the run, not money. Five platforms with their own steadyfetch actor (YouTube, Instagram, TikTok, LinkedIn, Google Ads Transparency Center) are listed at the end of this section; everything else is a direct file link or one of the tested sites. Facebook and TikTok are in both lists: ordinary video links transcribe here, ad links go to the ads actor.

Any direct media file link, from any host. .mp3 .m4a .wav .flac .ogg .opus .aac .aiff · .mp4 .m4v .mov .webm .mkv .avi — signed CDN links and links with no file extension work too; the file is identified by its actual bytes, not by its name. That covers S3 and CloudFront links, and every podcast host's own audio address.

Page links, on these 14 tested sites only:

Podcast hostsLibsyn · Megaphone · Buzzsprout · Acast · Spotify for Creators (creators.spotify.com, podcasters.spotify.com, anchor.fm — formerly Spotify for Podcasters / Anchor)
Podcast cataloguesApple Podcasts (an EPISODE page — podcasts.apple.com/…?i=<episode id>)
ArchivesArchive.org
Audio & videoSoundCloud · Loom · Twitch VODs · Wistia
Social videoFacebook (a reel facebook.com/reel/<id>, a watch link facebook.com/watch/?v=<id>, a /videos/<id> link, or an fb.watch share link) · TikTok (a video link tiktok.com/@<user>/video/<id>, a tiktok.com/t/<code> or vm.tiktok.com/<code> share link, or m.tiktok.com/v/<id>) · X (Twitter post links — x.com/<user>/status/<id>; twitter.com, the mobile./m. subdomains and the i/status / i/web/status forms all work)

Each of those was measured on a real public page, and the evidence is kept as a test fixture, so the list cannot drift away from what the actor can actually do.

On Facebook it is the video link that transcribes, not the page it sits on: a reel, a watch link, a /videos/<id> link or an fb.watch share link. A Facebook profile, a photo post or a page's Reels tab has no single video to pick, so it comes back as an uncharged row naming the shapes that do work, and a link whose video lives on some OTHER site is not followed from here either — paste that site's own address instead. Only Facebook's own video is transcribed. Facebook Ad Library links (facebook.com/ads/library/?id=…) still belong in our Facebook ads actor, which reads the ad's own creative — the row says so.

On TikTok it is the video link that transcribes: tiktok.com/@<user>/video/<id>, a tiktok.com/t/<code> or vm.tiktok.com/<code> share link, or m.tiktok.com/v/<id>. A TikTok profile, hashtag, sound or Discover page has no single video to pick, so it comes back as an uncharged row naming the shapes that do work, and a share link that leads somewhere other than TikTok is not followed from here either — paste that site's own address instead. Only TikTok's own video is transcribed. TikTok Creative Center ad links (ads.tiktok.com/business/creativecenter/topads/…) still belong in our TikTok ads actor, which reads the ad's own creative — the row says so.

On X (Twitter) it is the post link that transcribes: x.com/<user>/status/<id>. twitter.com, the mobile./m. subdomains and the i/status / i/web/status forms all work, and a trailing /video/1, /photo/1 or ?s=… share query is fine. A profile, a search, a hashtag page, a Space or a live broadcast has no single finished video to pick, so it comes back as an uncharged row naming the shape that does work — and a post whose video lives on some OTHER site (a link out to YouTube, Vimeo or SoundCloud) is not followed from here either: paste that site's own address instead. Only the post's own video is transcribed.

On Apple Podcasts, Media URLs takes the episode page — the link carrying ?i=<episode id>. A show link belongs in Podcast feeds or show links instead, where it resolves to the show's feed and transcribes its newest episodes; pasted into Media URLs it still comes back as an uncharged row asking which episode you meant, rather than picking one for you. Apple Podcasts is Apple's catalogue page and reads the podcast's own audio address out of it — Apple Music (music.apple.com) is a player that streams only inside the app and is refused as before.

The field name from our other transcript actors also works. If you came here from one of the sibling actors and sent your links in videoUrls, reelUrls or adLibraryUrls, they are read and transcribed exactly as if they had arrived in urls — with one extra uncharged row on the run naming urls as the field to use next time. Nothing is renamed and nothing is dropped; urls remains the actor's own field.

Any other page link is read once for the one media file it plainly embeds — the audio link its own player uses, an audio or video tag, a feed enclosure — and if there is exactly one, that file is transcribed as usual. A page with none, or one listing several files without saying which (a show page, say), comes back as an uncharged row naming what to paste instead: the direct file link, which works from any host, or a page link on a tested site. We do not claim "1,000+ sites" — this list is what was actually measured.

Spotify's own player pagesopen.spotify.com/episode/…, open.spotify.com/show/… and spotify.link short links — stream only inside Spotify's app, so there is no file to transcribe. They come back, before anything is fetched, as an uncharged drm_or_paywall row saying exactly that and where to paste instead: the episode's page on Spotify for Creators or any podcast host, or its direct audio link. Amazon Music and Apple Music player pages are answered the same way.

Sites we deliberately send elsewhere. YouTube, Instagram, LinkedIn and the Google Ads Transparency Center each have a dedicated steadyfetch actor that does the job better and cheaper than a general transcriber can, and so do the Facebook Ad Library and the TikTok Creative Center. Paste one of those page links here and the row tells you which actor to use — and if you already hold the direct media file link, paste that instead: it works.

Known limits, stated plainly. Vimeo only serves video to a signed-in account, so it cannot be transcribed from a public link. Live streams have no end and are refused before anything is spent — both a live page and a raw ICY/SHOUTcast radio URL are caught on the first few kilobytes, not after a download. Files over 256 MB come back as too_large with their measured size — point us at an audio-only version instead.

How much does it cost to transcribe audio?

One result = one audio minute actually transcribed. Billed per started minute, measured from the decoded audio, so a 90-second clip bills 2 minutes. $0.003 per audio minute — the same price on every Apify plan.

JobApprox. cost at $0.003/minute
A 45-minute podcast episode≈ $0.14
20 podcast episodes (~15 hours)≈ $2.70
A 3-hour recorded session≈ $0.54
Apify's $5 starter credit1,600 audio minutes

Platform usage (compute + transfer) is included in the event price — the per-minute price you see is the whole price. Unreachable links, music-only audio, oversized files and unsupported pages carry no result fee.

How to transcribe an mp3 URL (no code)

  1. Open the actor and paste your links into Media URLs, one per line.
  2. Formats to return already has all four ticked — plain text, timestamped segments, SRT and VTT — and they cost nothing extra. Untick any you do not want.
  3. Optional: set Max total minutes if you want a hard ceiling on the run.
  4. Optional: tick New items only if this run is a repeat of an earlier list and you want only the new items in the dataset.
  5. Click Start. Each link comes back as one JSON row. Export as JSON/CSV, or read it over the API.

Leave the list empty and the actor transcribes its fixed 25-second sample clip instead (one audio minute, charged like any run), so you see the output shape on real audio. Set only the options below and no links and that clip runs under them; the settings you did not touch keep their usual values.

Chain it after any scraper

You do not have to paste links by hand. Run whatever scraper you already use, then put its Dataset ID into this actor — with Apify's Connect actor integration the field fills itself, so the two runs become one workflow.

Every row is deep-scanned for a single audio or video link, whatever the scraper calls it: videoUrl, audioUrl, mediaUrl, playAddr, downloadAddr, a bare file link, nested or top-level. Thumbnails, covers and profile pictures are never mistaken for media, a row's video and its audio track count as one item (never two charges), and a link you also listed in Media URLs is transcribed once. Rows carrying no media link are counted on the run's status line and cost nothing. If you would rather not chain by ID, paste the rows straight into Dataset items.

Page links belonging to YouTube, Instagram, LinkedIn or the Google Ads Transparency Center — and Facebook Ad Library and TikTok Creative Center ad links — behave the same way here as anywhere else in this actor: an uncharged row naming the dedicated actor for that platform. A row carrying an ordinary TikTok or Facebook video link is transcribed here, like any other served link.

FAQ

How do I transcribe an mp3 URL? Paste the link into Media URLs and start the run. Any host works — the file is identified by its bytes, so signed CDN links and extension-less links are fine.

Speech to text API without a subscription? That is this actor. You pay per audio minute transcribed, with no monthly fee and no start fee, through your existing Apify account.

How do I transcribe a podcast episode to SRT? Paste the episode's audio URL (or its page on Libsyn, Megaphone, Buzzsprout, Acast or Spotify for Creators, or any episode page that plays the file) and start the run — the srt field comes back on the row by default, ready to save as a .srt file.

What happens if the link is wrong? The actor reads about 4 KB of the response and checks the actual bytes before downloading anything. A web page, an image or a dead link comes back as an uncharged row telling you what it found.

Music-only audio, or a video with no voice-over? Speech models hallucinate filler like "Thank you." over music. This actor detects that in any language and returns an honest, uncharged no_speech row instead of selling you a fake transcript.

How long can a file be? There is no duration limit. Long recordings are transcribed in overlapping windows and stitched back together with continuous timestamps; the row says when that happened. The only size limit is 256 MB per file.

Which languages? Whisper-class multilingual recognition — English, Spanish, German, Japanese, Arabic, Portuguese, Indonesian and about 90 more, detected automatically. The detected language ships on every row.

Do I need cookies, a login, or my own API key? No. The actor fetches public media only.

Can I feed it the output of another actor? Yes — put that run's Dataset ID in, or paste its rows into Dataset items. The actor finds the media link in each row itself, so you do not have to know which column your scraper used. See Chain it after any scraper above.

Why did some chained rows come back with nothing? Rows that carry no audio or video link are skipped, counted on the run's status line, and never charged — an image post or a comment row has nothing to transcribe.

Can I run this on a schedule? Yes — save the input as a Task, put the Task on an Apify Schedule, and add an integration on run succeeded. Items your account already has are never charged again — give the token the Schedule runs under key-value store Read, Write and Create permission (or set Actor runs to Full access) so this actor can open that memory — and ticking New items only leaves them out of the dataset so your integration receives only the new transcripts. See Run it on a schedule above.

Can I cap what a run spends? Two ways: maxTotalMinutes stops the run after that many charged audio minutes (up to 1,000,000 per run, and maxMinutesPerItem up to 100,000 per item — ask for a bigger number and the run goes ahead at the limit and says so), and Apify's own Maximum cost per run caps the charge in dollars. Either way the run stops cleanly and the items it did not reach come back as uncharged budget_stop rows.

Can it do a whole podcast, not one episode at a time? Yes. Put the show's RSS address or its Apple Podcasts show link in Podcast feeds or show links and set Episodes per show; the newest episodes are transcribed in one run, and a re-run of the same feed charges only for episodes it has not already delivered to your account.

Also from steadyfetch

Podcast Transcript Scraper — Audio & Video to Text, RSS & SRT is the general-purpose transcriber: any direct audio or video link, or a file you host. For the platforms below, use the platform's own actor — it reads the platform's listing, carries its metadata, and costs less per row.

The rest of the steadyfetch shelf — same contract everywhere: all-inclusive pay per event, no start fee, charged only on delivery.

FamilyActors
Ad creative intelligenceFacebook · Google Ads video · TikTok · LinkedIn · Google Ads text & OCR
Trends & keywordsGoogle Trends · Trends Now · Breakout keywords · Autocomplete keywords · Keyword volume & CPC · Social trends
YouTube transcriptsYouTube videos · YouTube channels
InstagramReel transcripts · Profile posts
JobsIndeed · Career sites by domain · Glassdoor · Multi-board · Google Jobs
AmazonProducts · Search · Bestsellers · Sellers
Any media fileSpeech to Text · any link or file

Free n8n workflow templates for this actor are listed on our profile website (link on our Apify profile).

Feedback & support

Found an issue? Open it on the Issues tab — we usually reply within a couple of hours, always within a day. Feature requests welcome, especially a site you would like added to the tested list.

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