# Speech to Text: Video & Audio Transcription from any URL (`pikoulas/video-transcriber`) Actor

Transcribe videos and audio to text or timestamped segments by URL: X (Twitter), TikTok, YouTube, LinkedIn, Loom, TED, SoundCloud, Dailymotion, Twitch and 1,000+ sites, playlists and channels, or any audio or video file. Whisper runs inside the run, in about 100 languages; long videos in full.

- **URL**: https://apify.com/pikoulas/video-transcriber.md
- **Developed by:** [Spyridon Pikoulas](https://apify.com/pikoulas) (community)
- **Categories:** AI, Videos, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 audio minute transcribed (whisper base)s

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Speech to Text: Video & Audio Transcription from any URL

Get the transcript of videos and audio as clean text, or as timestamped segments, from a URL:

- **Videos and posts:** X (Twitter), TikTok, YouTube, LinkedIn, Loom, TED, Dailymotion, Twitch
  clips, Kick, Streamable, Bilibili and 1,000+ other sites, as yt-dlp reads them.
- **Playlists, channels and profiles:** their latest videos, as many as you ask for.
- **Audio and video files:** any direct link to an .mp3, .m4a, .wav, .mp4, .webm and the rest,
  and audio pages such as SoundCloud.

The speech-to-text runs inside the actor: OpenAI's Whisper model, open source, on Apify's
servers. Nothing is sent to an outside AI service. It detects the language spoken in each video,
among about 100. Long videos are transcribed in full, ten minutes at a time.

Every result also carries what the site shows about the video, as far as it shows it: title,
description, uploader, date, duration, views, likes, comments, tags and thumbnail.

It costs **$0.003 per minute of audio** on Apify's paid plans ($0.006 on the free plan) with
Whisper base, and $0.008 ($0.016) with Whisper small, counted in started minutes: a 10-minute
video is $0.03. Videos without speech are free.

### What people use it for

- **AI and LLM pipelines:** summaries, RAG over videos, training data, notes from talks and calls.
- **Content research:** what creators, competitors and experts say, as text you can search.
- **Repurposing:** blog posts, newsletters, quotes, show notes and subtitles from videos.
- **Monitoring:** what's said about a brand or topic in videos across platforms.

### How to transcribe a video

1. Click **Try for free**; Apify's free plan covers a first run.
2. Paste the URLs of videos, audio files, playlists or channels under **Video or audio URLs**.
3. Click **Start**, then download the results as JSON, CSV, Excel or HTML, or read them through
   the API.

**Max videos per playlist or channel** sets how many each of those gives. **Max minutes per
video** transcribes, downloads and charges only each video's first minutes. **Speech-to-text
model** picks between Whisper base, fast and good on clear speech, and Whisper small, more
accurate on accents, crosstalk, names and languages other than English, and about three times
slower. **Language** fixes the language spoken when you know it; otherwise each video's is
detected. Turn on **Include timestamps** for `segments`, each line with its start and end.

```json
{
  "urls": [
    "https://x.com/NASA/status/2116256206922616862",
    "https://www.linkedin.com/posts/the-mathworks_2_what-is-mathworks-cloud-center-activity-7151241570371948544-4Gu7",
    "https://www.youtube.com/playlist?list=PLzMcBGfZo4-mP7qA9cagf68V06sko5otr",
    "https://example.com/files/interview.mp3"
  ],
  "maxVideosPerUrl": 5,
  "model": "base",
  "includeTimestamps": true
}
```

### Output

```json
{
  "input": "https://www.linkedin.com/posts/the-mathworks_2_what-is-mathworks-cloud-center-activity-7151241570371948544-4Gu7",
  "url": "https://www.linkedin.com/posts/the-mathworks_2_what-is-mathworks-cloud-center-activity-7151241570371948544-4Gu7",
  "platform": "LinkedIn",
  "id": "7151241570371948544",
  "title": "What Is MathWorks Cloud Center? | MathWorks",
  "durationSeconds": 162,
  "likeCount": 127,
  "language": "en",
  "languageProbability": 1,
  "text": "Cloud Center enables you to create, access, and manage public cloud resources. You can easily launch Windows or Linux machine with MATLAB install that you can access remotely. …",
  "transcribedSeconds": 161.9,
  "isComplete": true,
  "billedMinutes": 3,
  "segments": [{"start": 0, "end": 4.96, "text": "Cloud Center enables you to create, access, and manage public cloud resources."}]
}
```

A video from a playlist or channel also has `playlistTitle`. A video stopped short by **Max
minutes per video**, the run's spending limit or its timeout comes with what was transcribed,
`isComplete: false`, its `transcribedSeconds` and a `stoppedBecause`, and is charged only for
those minutes. A video without speech (music only, or silent), or one that can't be read, comes
with its details and a `noTranscriptReason`, and costs nothing.

### Use it as an API

Apify's API starts a run and returns its dataset as JSON; its Python and JavaScript clients, and
its Make, Zapier and n8n integrations, work the same way. Long videos take minutes, so start a
run and read its dataset when it ends.

```bash
curl -X POST "https://api.apify.com/v2/acts/pikoulas~video-transcriber/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"urls": ["https://x.com/NASA/status/2116256206922616862"], "maxMinutesPerVideo": 30}'
```

AI agents can call it as a tool through Apify's MCP server: `https://mcp.apify.com?tools=pikoulas/video-transcriber`.

### How much does it cost to transcribe video to text?

With Whisper base you pay **$0.003 per started minute of audio** on Apify's paid plans, and
$0.006 on the free plan: an hour-long video is $0.18 ($0.36 on the free plan). Whisper small,
which takes about three times the computing, is $0.008 per started minute ($0.016 on the free
plan). `billedMinutes` shows each video's. Videos without speech are free, and so is everything
else the run fetches, with one exception: some sites (YouTube often, Bilibili) refuse Apify's
servers, and the run then reaches them through Apify's residential proxy, whose traffic is
charged at $0.0012 per 100 KB. Only the sound is downloaded where the site serves it apart, and
only the minutes you asked for, so an hour of YouTube audio is about 35 MB, $0.42. There are no
monthly fees.

The run stops at the spending limit you set, mid-video if need be, and charges only what it
transcribed.

### Good to know

- Whisper writes what it hears: names, jargon and crosstalk can come out wrong, and Whisper small
  gets more of them right. Speakers aren't told apart, and sung lyrics over music are mostly left
  out with the music.
- A run transcribes about 20 minutes of audio a minute with Whisper base at the default 8 GB of
  memory, and about 7 with Whisper small. More memory is faster, at the same price per minute.
  The default timeout of an hour covers about 20 hours of audio with base; raise it for more.
- Facebook, Instagram, Vimeo and Reddit aren't read yet. For Instagram Reels, TikTok and podcasts
  there are dedicated actors: Instagram Reel Transcripts, TikTok Transcripts and Podcast
  Transcripts. For YouTube videos with captions, YouTube Transcripts is cheaper.
- Private, members-only, paid and age-restricted videos can't be read; the result says why.
- Media protected against copying (DRM), as streaming services serve it, is never read: the
  actor doesn't get past copy protection, and such a video comes back with a
  `noTranscriptReason` saying so.
- A video given twice in one run, by URL and in a post that embeds it say, is given once.
- Files up to 1.5 GB.

### FAQ

#### Is it legal to transcribe videos?

It reads only what sites show publicly, without logging in. Videos are their creators'
copyrighted work: a transcript for your own research, analysis or accessibility is often
allowed, depending on your country's copyright law, but republishing it may need the rights
holder's permission, and personal data in it is protected by laws such as the GDPR and the
CCPA. Sites' terms may also limit how you use what you collect. If you're unsure, ask a lawyer;
Apify's [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/) is a good start.

Not affiliated with YouTube, TikTok, X or LinkedIn; their names are trademarks of their owners.

#### Something missing or not working?

Open an issue on the **Issues** tab with the input you used, or ask there for a site or field you
need.

# Actor input Schema

## `urls` (type: `array`):

Pages of videos or audio (x.com/.../status/..., tiktok.com, youtube.com, linkedin.com/posts/..., loom.com/share/..., ted.com, soundcloud.com, dailymotion.com, twitch.tv clips, and 1,000+ other sites), playlists and channels, or direct links to audio or video files (.mp3, .m4a, .mp4, .wav...).

## `maxVideosPerUrl` (type: `integer`):

Videos taken from each playlist, channel or profile URL, in the site's order. A single video's URL is always one.

## `maxMinutesPerVideo` (type: `integer`):

Transcribes only each video's first minutes, and charges only those. Empty: whole videos.

## `model` (type: `string`):

Whisper base is fast and good on clear speech. Whisper small is more accurate on accents, crosstalk, names and languages other than English, takes about three times as long and costs $0.008 per started minute against base's $0.003 ($0.016 and $0.006 on Apify's free plan).

## `language` (type: `string`):

The language spoken, as a code (en, es, pt, de, hi...), when all the videos share one. Empty: detected for each video.

## `includeTimestamps` (type: `boolean`):

Adds the transcript as segments with their start and end in seconds, next to the plain text.

## `proxyConfiguration` (type: `object`):

Not needed for most runs: a site that refuses Apify's servers is switched to Apify's residential proxy by itself, its traffic charged as its own event.

## Actor input object example

```json
{
  "urls": [
    "https://www.ted.com/talks/candace_parker_how_to_break_down_barriers_and_not_accept_limits"
  ],
  "maxVideosPerUrl": 10,
  "model": "base",
  "language": "",
  "includeTimestamps": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "urls": [
        "https://www.ted.com/talks/candace_parker_how_to_break_down_barriers_and_not_accept_limits"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("pikoulas/video-transcriber").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "urls": ["https://www.ted.com/talks/candace_parker_how_to_break_down_barriers_and_not_accept_limits"] }

# Run the Actor and wait for it to finish
run = client.actor("pikoulas/video-transcriber").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "https://www.ted.com/talks/candace_parker_how_to_break_down_barriers_and_not_accept_limits"
  ]
}' |
apify call pikoulas/video-transcriber --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,pikoulas/video-transcriber"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/80pitg2axKHvKaAFx/builds/GFApTfbJrjq7OUdQG/openapi.json
