Vimeo, Loom & Podcast Transcript Generator - Video URL to Text avatar

Vimeo, Loom & Podcast Transcript Generator - Video URL to Text

Pricing

from $12.00 / 1,000 stt minute (zero-setup)s

Go to Apify Store
Vimeo, Loom & Podcast Transcript Generator - Video URL to Text

Vimeo, Loom & Podcast Transcript Generator - Video URL to Text

Vimeo transcript, Loom transcript, podcast RSS, HLS video, and any direct media URL to text. Transcribe video URLs via API, MCP, or schedule — speech to text, one JSON row per item. Zero-setup STT or bring your own key.

Pricing

from $12.00 / 1,000 stt minute (zero-setup)s

Rating

0.0

(0)

Developer

Heim AI

Heim AI

Maintained by Community

Actor stats

1

Bookmarked

36

Total users

17

Monthly active users

an hour ago

Last modified

Share

Media URL Transcriber — Video, Podcast RSS, Vimeo, Loom to Text

Any cooperative media URL → transcript. Pass direct files, HLS VOD playlists, Vimeo videos, Loom shares, or podcast RSS feeds; get one JSON dataset row per media item. Zero setup for captioned Vimeo; managed speech-to-text for everything else. Built for MCP agents, API clients, and scheduled pipelines.

Actor idkaz_kakyo/media-url-transcriber
Minimal input{ "mediaUrls": ["https://vimeo.com/76979871"] }
Cost$0.012/min STT zero-setup · $0.005/min BYOK · $0.005 caption item · $0.00005 base start event
OutputDataset rows with type: "transcript" or type: "error"

Supported inputs

InputHow it works
Direct audio/video URL (mp3, mp4, m4a, wav, flac, ogg, opus, aac, webm, mov, mkv)Zero-setup decodes locally before STT; BYOK sends the URL
HLS .m3u8 VOD playlistActor assembles audio, sends to STT
Vimeo (vimeo.com/{id}, player, unlisted hash)Published captions ($0.005) when available; else STT
Loom share/embed (loom.com/share/{32hex})Signed mp4 → STT (no keyless captions)
Podcast RSS/Atom feedLatest N episode enclosures → STT

Use something else instead:

You have…Use instead
YouTube watch/shorts/youtu.bekaz_kakyo/youtube-transcripts
TikTok / Instagram / Facebook / X pageA dedicated platform transcript actor from the Apify Store
Spotify / SoundCloud / Apple Podcasts pageThe podcast's RSS feed URL (this actor accepts feeds directly)
Google Drive / Dropbox share pageAudio Transcriber, or a direct-download file URL
Only a direct media file URLAlso fine here — or kaz_kakyo/audio-transcriber

Pricing

EventPriceWhen
Actor start$0.00005 baseOnce per run; platform scales with memory above 1 GB
STT minute (zero-setup)$0.012No BYOK key — transcription included
STT minute (BYOK)$0.005deepgramApiKey set — you also pay your own provider bill
Caption item$0.005Vimeo delivered via published captions (no STT)

Minutes round up per item. A 30-minute episode has $0.360 managed minute charges or $0.150 BYOK actor minute fees plus your own provider bill. One captioned Vimeo item has a $0.005 caption charge. Add the memory-scaled start event to each run. Use the live Pricing tab for the memory multiplier. A run budget covers this run only, not repeated runs.

Call it (MCP / API / schedule)

MCP (agents)

{
"actor": "kaz_kakyo/media-url-transcriber",
"input": {
"mediaUrls": [
"https://dpgr.am/spacewalk.wav",
"https://vimeo.com/76979871"
]
}
}

Optional extras:

{
"mediaUrls": ["https://feeds.npr.org/510289/podcast.xml"],
"episodesPerFeed": 3,
"preferCaptions": true,
"includeSrt": true,
"diarize": true
}

After the run, read the default dataset. Filter type === "transcript"; treat type === "error" as per-item failure. Bad/unsupported URLs become error rows and the run still SUCCEEDS. The run fails on speech-to-text auth/credit errors, post-charge delivery failure, or when every STT item is stt-unavailable and nothing was delivered (no key configured).

API / apify-client

Install apify-client, set your Apify APIFY_TOKEN, and run this 26-second sample. Expect one transcript and VTT, billed as one minute: $0.012 for transcription plus the memory-scaled start event. Select 4096 MiB for zero-setup local decoding. No separate provider account is required.

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('kaz_kakyo/media-url-transcriber').call(
{ mediaUrls: ['https://dpgr.am/spacewalk.wav'], includeVtt: true },
{ maxTotalChargeUsd: 0.05, memory: 4096 },
);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const transcripts = items.filter((i) => i.type === 'transcript');
const errors = items.filter((i) => i.type !== 'transcript');
console.log({ runId: run.id, transcripts, errors });

REST: POST /v2/acts/kaz_kakyo~media-url-transcriber/runs with your token.

RSS and recurring runs

An RSS input selects the latest episodesPerFeed episodes on each new run. Scheduling the same feed can transcribe and bill those episodes again. For recurring use, keep a durable ledger of episode IDs and run IDs, and submit only new enclosure URLs.

Use Audio Transcriber for an already extracted podcast audio URL at $0.01/min; use this actor when you need RSS expansion, Vimeo/Loom resolution or HLS handling. Follow the podcast guide for a first run and a supervised n8n starter with documented limits.

Save every output type, handle failed/timed-out runs, and inspect an existing run before retrying an uncertain request. maxTotalChargeUsd caps each run, not all polls or retries.

Output contract

Success row:

{
"type": "transcript",
"url": "https://vimeo.com/76979871",
"source": "vimeo-captions",
"title": "The New Vimeo Player…",
"videoId": "76979871",
"transcript": "…",
"segments": [{ "start": 0.0, "end": 2.4, "speaker": null, "text": "…" }],
"srt": "1\n00:00:00,000 --> …",
"vtt": "WEBVTT\n\n…",
"durationSeconds": 62,
"language": "en",
"billedEvent": "caption-item",
"billedCount": 1
}
FieldNotes
sourcedirect | hls | vimeo-captions | vimeo-stt | loom | podcast-rss
segmentsPresent on success; if the row exceeds ~4 MB, segments (and/or srt/vtt) may be spilled to the key-value store and replaced by segmentsUrl / srtUrl / vttUrl
srt / vttPer includeSrt (default true) / includeVtt (default false); same KVS spill as above when oversized
summarySTT + summarize + English only; never on caption path
confidence, modelSTT only (model is always nova-3)
feedUrl, episodeTitle, episodeGuid, pubDatePodcast RSS rows
billedEvent, billedCountAlways present

Dataset views (Transcripts / Errors) select columns for display — they do not filter by row type. Both transcript and error rows appear in the underlying dataset; filter client-side on type.

Error row (never charged):

{
"type": "error",
"url": "https://…",
"errorCode": "unsupported-platform",
"error": "…pointed FIX…",
"billedEvent": null,
"billedCount": 0
}

errorCode values: unsupported-platform · not-media · not-found · private · too-long · too-large · live-stream · encrypted-hls · stt-unavailable · stt-upstream · no-audio · fetch-failed · feed-empty · invalid-url · over-budget · insufficient-resources · skipped

When the run itself fails vs. reports a row. Anything wrong with one input (not-found, too-long, no-audio, …) becomes an error row and the run still succeeds — check type per row. Anything that made transcription impossible for the whole run (stt-unavailable = no key available, stt-upstream = the STT service throttling or down) fails the run when nothing at all was delivered, so an automated caller can retry on status instead of parsing rows. A run that delivered some transcripts still succeeds, with the blocked items recorded as rows.

Retrying after stt-upstream or stt-unavailable. Items blocked because speech-to-text could not run are not checkpointed, so resurrecting the run re-attempts them once the cause clears after checking the run log and dataset. Charging precedes delivery: a post-charge delivery failure must be investigated before retrying. Starting a new run can charge again. A re-attempted item keeps its original error row and gains a new row, so deduplicate on url and prefer the row with type: "transcript".

Honest limits

  • Loom = STT only — no keyless caption endpoint.
  • HLS is beta: fMP4 and MPEG-TS/AAC (or MP3) covered; encrypted, live, and byte-range playlists are rejected. Assembly capped at 512 MB (sequential stream-to-disk).
  • No YouTube / TikTok / Instagram / Facebook / X — use dedicated actors.
  • Zero-setup duration and budget checks decode the full media locally before paid processing. The decoded audio must fit maxDurationMinutes, the remaining run budget, and a 2 GiB decoded-audio limit; oversized files are rejected rather than partially transcribed. Direct downloads remain capped at 2048 MB. BYOK keeps the existing provider URL path and metadata-based duration checks.
  • Temporary media is downloaded and decoded on the worker for zero-setup checks, then deleted. Source audio is not published to run outputs.
  • Zero-setup disk admission reserves 4 GiB per active item, including HLS intermediates, and keeps 1 GiB for the runtime. Apify disk equals twice run memory: 4096 MiB admits one pooled item, 8192 MiB admits three, and 16384 MiB admits four. Smaller or unknown platform allocations that cannot cover a full item return uncharged insufficient-resources errors before downloads, assembly or decoding. Waiting items recheck the monetary budget. Caption delivery and BYOK transport retain their existing paths.
  • Summaries are English-only (an upstream summarizer limitation).
  • Caption quality = whatever the Vimeo publisher uploaded.
  • Privacy: transcripts contain whatever is spoken (or captioned) in the media URLs you submit — that is the product. Treat outputs as sensitive if the source media is.
  • Caps: 100 URLs/run, 200 items after feed expansion, default maxDurationMinutes 180.

Run memory: runs default to 4096 MiB and a 3600-second timeout. If you set memory yourself (API memory, a saved task or a schedule), use at least 4096 MiB for zero-setup speech-to-text items; smaller runs return uncharged insufficient-resources rows, and resurrecting such a run with more memory retries those items. A 4096 MiB run processes one zero-setup item at a time. BYOK and caption items work with less memory. At 4096 MiB the start event counts as four units ($0.0002 per run).

Input (agent-first)

  • mediaUrls (required) — see Supported inputs. Prefill demo: spacewalk.wav + public Vimeo (caption path works keyless).
  • episodesPerFeed — default 1 (max 25).
  • preferCaptions — default true (Vimeo caption path).
  • captionLanguage — BCP-47 prefix; fallback en, then first track.
  • deepgramApiKey — optional BYOK; encrypted; sent only to the transcription provider.
  • language / detectLanguage / diarize / smartFormat / paragraphs / summarize / includeSrt / includeVtt / maxDurationMinutes — see Input tab; every field states its default there.

See the Input tab for the full schema. See the API tab for run/dataset endpoints.


If this saved you time, a Store review on the actor page helps a solo dev. Hit a problem? Open an issue.

Telemetry

When telemetry is configured, the actor sends usage and charge-summary events to the developer: actor and run IDs, a pseudonymous caller hash, paying-plan flag, origin, timestamps and confirmed event counts, plus a per-run workflow summary: counts of source types (direct file, HLS, Vimeo, Loom, podcast RSS, rejected), transcript lengths in broad buckets (under 5 min, 5–30, 30–120, over 120), batch size bucket, which on/off options were used, whether the language was English or another language, and the memory tier. No media URLs, hostnames, file names, input content or transcripts are included. Reporting is best-effort; missing telemetry does not mean no charge occurred.