Video Transcriber - Video & Audio to Text Transcript
Pricing
from $1,250.00 / 1,000 short video (under 5 min)s
Video Transcriber - Video & Audio to Text Transcript
Transcribe any video or audio URL to text. Full transcript, timestamped segments, SRT subtitles, word timings. YouTube, Vimeo, SoundCloud, direct media links. Whisper AI, 50+ languages, no API keys. $0.02 per minute.
Pricing
from $1,250.00 / 1,000 short video (under 5 min)s
Rating
0.0
(0)
Developer
Marielise
Maintained by CommunityActor stats
0
Bookmarked
516
Total users
20
Monthly active users
8 days ago
Last modified
Categories
Share
Turn any video or audio URL into a text transcript with timestamps. Paste a YouTube, Vimeo or SoundCloud link, or a direct .mp3 / .mp4 file, and get the full video transcript, timestamped segments, word timings and an SRT subtitle file back. Whisper AI, 50+ languages, no API keys.
$0.02 per transcribed minute. A 10-minute video costs $0.20. A run that produces no transcript costs nothing.
What you get
- Full transcript as one string, plus timestamped segments with start and end times
- Word-level timestamps for every word (on by default)
- SRT subtitles or a plain
.txtfile, saved to the key-value store on request - Language auto-detection across 50+ languages, or pin the language yourself
- Media metadata: title, uploader, view count, upload date, platform
- Up to 2 hours per recording
Quick start
Default input transcribes a 4-minute Vimeo short film for $0.08:
{"url": "https://player.vimeo.com/video/108650530","language": "auto","includeTimestamps": true}
API (cURL)
curl -X POST "https://api.apify.com/v2/acts/marielise.dev~video-transcriber-ultimate/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"url": "https://player.vimeo.com/video/108650530", "language": "auto"}'
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('marielise.dev/video-transcriber-ultimate').call({url: 'https://player.vimeo.com/video/108650530',language: 'auto',});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items[0].text);console.log(items[0].segments);
Python
from apify_client import ApifyClientclient = ApifyClient('YOUR_TOKEN')run = client.actor('marielise.dev/video-transcriber-ultimate').call(run_input={'url': 'https://player.vimeo.com/video/108650530','language': 'auto',})items = client.dataset(run['defaultDatasetId']).list_items().itemsprint(items[0]['text'])
Pricing
Pay per event. No subscription, no per-result fee.
Per-minute pricing takes effect on 29 September 2026. Until then the previous duration tiers shown on the Pricing tab still apply.
| Event | Price | When |
|---|---|---|
| Transcribed minute | $0.02 | Every started minute of audio, one minute minimum. Charged only after the transcript is saved. |
| Residential proxy minute | $0.01 | Added per transcribed minute only when the download went through a residential proxy: you enabled useResidentialProxy, or YouTube's free proxy was unavailable and the actor fell back. |
| Recording | Cost | With residential proxy |
|---|---|---|
| 3 minutes | $0.06 | $0.09 |
| 10 minutes | $0.20 | $0.30 |
| 30 minutes | $0.60 | $0.90 |
| 1 hour | $1.20 | $1.80 |
| 2 hours | $2.40 | $3.60 |
Platform compute is included. Nothing is charged for a run that ends without a transcript: unsupported URL, video not found, blocked download, no speech detected, recording over 2 hours, or an actor-side error.
Free-plan users get every feature. The only limit is your run's Max total charge; the actor checks it against the recording length before downloading anything and stops, uncharged, if the recording would exceed it.
Supported sources
| Source | Status | Notes |
|---|---|---|
| YouTube | Supported | Downloads through a built-in free proxy. If that proxy is unavailable the actor falls back to a residential proxy and adds $0.01 per minute. |
| Vimeo | Supported | Use player.vimeo.com/video/ID. Plain vimeo.com/ID links often fail authorization. |
| SoundCloud | Supported | Podcasts, interviews, any audio track |
| Direct media links | Supported | Any public URL ending in .mp3, .mp4, .m4a, .wav, .webm, such as a webinar recording or archive.org/download/<item>/<file>.mp3 |
| Other yt-dlp sites | Best effort | Hundreds of sites listed under yt-dlp supported sites. Sites that serve only muxed video are downloaded at the smallest rendition and the audio track is extracted. |
| TikTok, X/Twitter, Facebook, Instagram, LinkedIn, Amazon | Not supported | Rejected before any download. Not charged. |
Nothing in this table crashes the run. An unsupported or blocked URL finishes with a labelled status record in the key-value store under OUTPUT, and you are not charged.
Private, age-restricted and geo-restricted content
| Case | What to do |
|---|---|
| Private or age-restricted | Export cookies from a logged-in browser (Netscape format) and paste them into cookies |
| Geo-restricted | Set useResidentialProxy to true and pick a proxyCountry where the video is viewable |
Input
| Parameter | Type | Default | Description |
|---|---|---|---|
url | string | required | Video or audio URL. One per run; playlists are not expanded. |
language | string | "auto" | ISO 639-1 code (en, es, ja) or auto |
includeTimestamps | boolean | true | Word-level timestamps. Segment times are always returned. |
outputFormat | string | "json" | json, text (adds transcript.txt) or srt (adds transcript.srt) |
useResidentialProxy | boolean | false | Route the download through a residential proxy. +$0.01 per minute. |
proxyCountry | string | "US" | Proxy country when a residential proxy is used |
cookies | string | Netscape-format cookies for private or age-restricted content |
Output
One dataset item per run:
{"url": "https://player.vimeo.com/video/108650530","title": "Wanderers - a short film by Erik Wernquist","duration": 230,"billedMinutes": 4,"language": "English","text": "For all its material advantages, the sedentary life has left us edgy, unfulfilled...","segments": [{"text": "For all its material advantages, the sedentary life has left us edgy, unfulfilled.","start": 0,"end": 17.7,"words": [{ "text": "For", "start": 0.0, "end": 0.32 },{ "text": "all", "start": 0.32, "end": 0.5 }]}],"words": [{ "text": "For", "start": 0.0, "end": 0.32 }],"metadata": {"platform": "vimeo","uploader": "Erik Wernquist","viewCount": 2100000,"uploadDate": "20141129"},"processedAt": "2026-09-14T09:12:00.000Z","provider": "groq-whisper"}
| Field | Type | Description |
|---|---|---|
url | string | Input URL |
title | string | Title from the platform |
duration | number | Audio length in seconds, as measured from the file |
billedMinutes | number | Minutes charged for this run |
language | string | Detected or specified language |
text | string | Complete transcript |
segments[] | array | text, start, end, and words[] when includeTimestamps is on |
words[] | array | Flat word list with start and end, present when includeTimestamps is on |
metadata | object | platform, uploader, viewCount, uploadDate |
processedAt | string | ISO timestamp |
provider | string | Transcription engine |
With outputFormat: "srt" the key-value store also holds transcript.srt:
100:00:00,000 --> 00:00:17,700For all its material advantages, the sedentary life has left us edgy, unfulfilled.
When there is no transcript
The run still finishes, and the key-value store record OUTPUT says why:
{"ok": false,"status": "not_found","reason": "The video could not be found.","nextSteps": ["Open the URL in a private browser window to confirm the video still exists and is public."],"charged": false}
Statuses: unsupported_platform, not_found, blocked, download_failed, invalid_input, video_too_long, budget_exceeded, no_speech, audio_too_large, transcription_failed, quota_exceeded, misconfigured, error.
How it works
- Reads the media metadata first. Recordings over 2 hours, or over your run's max total charge, stop here uncharged.
- Downloads the smallest stream that carries the speech.
- Compresses the audio to 16 kHz mono, the format Whisper works in internally, so a 2-hour recording uploads in under 25 MB.
- Transcribes with Whisper large-v3-turbo via Groq.
- Saves the transcript, then charges per minute.
A 4-minute video finishes in about 15 seconds end to end.
Use cases
- Video transcript for SEO: publish the full transcript under the video so search engines index the spoken content
- Subtitles: generate SRT files for YouTube, Vimeo or a course platform
- Content repurposing: turn talks and podcasts into blog posts, show notes, newsletters, social clips
- Research: make interviews and lectures searchable and quotable
- AI pipelines: feed the transcript into summarisation, translation or a RAG index
- Media monitoring: transcribe a channel's uploads on a schedule and search them for mentions
Limitations
- One recording per run, up to 2 hours. Start runs in parallel for batches.
- Recorded content only. Live streams and DRM-protected media cannot be downloaded.
- Music-only or silent recordings produce no transcript and are not charged.
- Sites not in the supported table may or may not work; a failure is reported and uncharged.
FAQ
Do I need a Whisper or Groq API key? No. Transcription is included in the per-minute price.
How accurate is it? Whisper large-v3 class accuracy, typically 95%+ on clear speech. Background music, crosstalk and heavy accents lower it.
How long does a run take? Roughly 4 seconds per minute of audio, dominated by the download. A 1-hour recording takes 3 to 5 minutes.
Why was I charged 4 minutes for a 3:50 video? Every started minute counts.
Can I get a YouTube transcript without a proxy charge? Yes. YouTube uses a built-in free proxy first. The residential surcharge applies only when that proxy is unavailable, and the run's RUN_METADATA record says whether it was used.
Can I cap what a run can cost? Set "Max total charge" in the run options. The actor checks the recording length against it before downloading and stops, uncharged, if it would not fit.
Built by Ekipnico. Transcription by Whisper via Groq.