# Video Transcriber - YouTube, TikTok, Instagram & X to Text (`topapi/video-transcriber`) Actor

Transcribe any public video URL to text with timestamps: YouTube, TikTok, Instagram reels, X, Facebook, Vimeo, Loom, LinkedIn, podcasts, direct files. Platform captions first ($1.80 per 1,000 videos), built-in Whisper otherwise ($0.0054 per audio minute). SRT, VTT, translation. No login.

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

## Pricing

from $5.40 / 1,000 audio minute transcribeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

### What does Video Transcriber do?

**Video Transcriber** turns any public video or audio link into a timed transcript: YouTube, TikTok, Instagram reels and posts, X (Twitter), Facebook videos and reels, Vimeo, Dailymotion, Loom, Wistia, LinkedIn posts, podcast feeds, Apple Podcasts shows and direct media files. When the platform publishes its own caption track the actor reads it; when it does not, built-in Whisper speech recognition writes one. One row per video: the full text, timed segments, language, title, author and duration.

Video to text - speech to text - TikTok transcript - Instagram reel transcript - YouTube transcript - X video transcript

- 🎬 **One field for every platform:** paste links from 11 platforms (plus any page with a video in it), the platform is recognised from the URL.
- 💬 **Captions first:** a video that carries its own caption track is billed one flat price per video, whatever its length.
- 🎙️ **Speech recognition otherwise:** Whisper runs inside the actor (English goes to tiny.en, other languages to base, or pick small for accents and noise). No API key of yours.
- ⏱️ **Timed output:** segments, word timings, SRT and WebVTT subtitles, a `[0:03 - 0:07]` transcript and RAG chunks, all free.
- 🌍 **Any language, or English:** the spoken language is detected; switch on translation to get English text.
- 🔁 **Channels, playlists and podcast feeds** expand to their newest videos; monitor mode returns only the ones you have not had before.
- 💸 **Pay only for transcripts:** private or removed videos, music without speech and every other failure come back as free rows with the reason.
- 🔌 **API, schedules, webhooks, Make, Zapier, n8n and MCP** through Apify.

### What data can you get from a video?

| | | |
|---|---|---|
| 📝 Full transcript `transcript` | ⏱️ Timed segments `segments` | 🔤 Word timings (`words` in each segment) |
| 🎞️ SRT `srt` and WebVTT `vtt` | 🕒 `[0:03 - 0:07]` lines `timestampedTranscript` | 🧩 RAG chunks with start/end `chunks` |
| 🌍 Language `language` + confidence | 🔁 English translation + `spokenLanguage` | 💬 Where the words came from `transcriptSource` |
| 🏷️ Caption track used `captionLanguage` | 🤖 Auto-generated caption? `captionAutoGenerated` | 📚 Every caption language listed `availableCaptionLanguages` |
| 🎬 Platform, video id, canonical URL | 📰 Title / post caption `title`, `description` | 👤 Author, display name, profile link |
| 📅 Published `publishedAt` | ⏳ Duration `durationSec` | 👀 Views where the platform shows them |
| 🖼️ Thumbnail | 🎣 The first 3 seconds `hook` | 🔢 Words, characters, segments |
| 🎙️ Show name for podcasts `podcast` | 💲 What the row was billed `chargedEvent`, `billedMinutes` | ⚠️ `status`, `errorCode`, `error`, `note` |

On a 16-video test run across 8 platforms (TikTok, Instagram, X, Facebook, LinkedIn, YouTube, Vimeo, Loom) 14 videos returned a transcript - 7 from the platform's captions and 7 by speech recognition - and 2 music-only clips came back as free `NO_SPEECH` rows. Fill on that run's 14 transcripts: `transcript`, `durationSec`, `title` and `segments` 100%, `language` 93% (Loom does not name its transcript's language), `author` and `thumbnail` 86%, `publishedAt` 79%, `viewCount` 29% (only where the platform shows views to visitors).

### How to transcribe videos with Video Transcriber

1. [Create a free Apify account](https://console.apify.com/sign-up) (free monthly credit included).
2. Open **Video Transcriber** and click **Try for free**.
3. Paste your links into **Video or audio URLs** - one per line, any mix of platforms.
4. Leave **Transcript source** on *Captions first, speech recognition otherwise*, or force one of them.
5. Click **Start**. Transcripts arrive in the dataset as each video finishes.
6. Open **Storage** and **Export** as JSON, CSV or Excel - or read the rows through the API.

### ⬇️ Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `urls` | list of URLs | - | Videos, Shorts, reels, posts, channels, playlists, podcast feeds, Apple Podcasts shows, direct files. |
| `urlsFromFile` | URL | - | A public .txt / .csv; every http(s) link in it is transcribed. |
| `datasetId` | string | - | The dataset of another actor's run (TikTok, Instagram, YouTube, X scrapers...); the video link in each row is found. Up to 10,000 rows. |
| `datasetItems` | JSON rows | - | Paste rows from any scraper instead of a dataset id. |
| `transcriptSource` | select | Captions first | `auto` = captions when the video has them, speech recognition otherwise; `captions` = captions only; `asr` = speech recognition only. |
| `language` | string | `auto` | Spoken language code or name (`en`, `es`, `Spanish`); forces recognition and picks that caption track. |
| `preferredCaptionLanguages` | list | - | Caption tracks to prefer, in order (`en`, `es`). Empty = the video's own spoken language. |
| `translateToEnglish` | boolean | false | English text whatever is spoken: an English caption track or YouTube's own translation when available, Whisper's translation otherwise. |
| `model` | select | Auto | `auto` (tiny.en for English, base otherwise), `tiny`, `base`, `small`. Same price per minute. |
| `minWords` | integer | 1 | Fewer words = a free `NO_SPEECH` row. |
| `publishedAfter` | date or period | - | `2026-10-01`, `7 days`, `24 hours`; videos with an unknown date are kept. |
| `maxMinutesPerVideo` | integer | 120 | Speech recognition stops after this many minutes of one video (the row says `truncated`). Caption transcripts are never cut. |
| `monitorMode` + `monitorStoreName` | boolean + string | false | Skip every video a previous run with the same monitor name delivered. |
| `outputFormats` | multi-select | segments | `segments`, `words`, `srt`, `vtt`, `timestamped`, `chunks`. Plain text is always included. |
| `chunkSize` | integer | 1000 | Characters per RAG chunk. |
| `maxVideosPerSource` | integer | 10 | Newest videos taken from each channel, playlist or feed. |
| `maxResults` | integer | 0 | Stop after this many transcripts (0 = no limit). |
| `maxTotalMinutes` | integer | 0 | Stop speech recognition after this many billed audio minutes in the run. |
| `includeFailedRows` | boolean | true | Free rows for videos that could not be transcribed. |
| `maxConcurrency` | integer | 4 | Videos resolved and downloaded at the same time. |
| `proxyConfiguration` | proxy | - | Optional; leave empty and the actor picks the route per site. |

#### Input JSON

```json
{
  "urls": [
    "https://www.tiktok.com/@zachking/video/7095025543627705643",
    "https://www.instagram.com/reel/DMflZnXOKUj/",
    "https://x.com/NASA/status/2113776971603689874",
    "https://www.youtube.com/watch?v=jNQXAC9IVRw",
    "https://www.youtube.com/@NASA",
    "https://podcasts.apple.com/us/podcast/the-daily/id1200361736"
  ],
  "transcriptSource": "auto",
  "outputFormats": ["segments", "srt"],
  "maxVideosPerSource": 5
}
```

#### Which links work

| Platform | Links | Where the transcript comes from |
|---|---|---|
| YouTube | `watch?v=`, `youtu.be/`, `/shorts/`, `/live/`, `/embed/`, channels (`@handle`, `/channel/`), playlists | YouTube's captions (creator or auto-generated, the video's own audio language); speech recognition when a video has none |
| TikTok | `/@user/video/<id>`, `vm.` / `vt.` short links, embeds | TikTok's own captions when the video has them; speech recognition otherwise |
| Instagram | `/reel/`, `/reels/`, `/p/`, `/tv/` | speech recognition (Instagram shows no captions to visitors) |
| X (Twitter) | `x.com` / `twitter.com` `/status/<id>` | speech recognition |
| Facebook | `/watch/?v=`, `/reel/`, `/<page>/videos/<id>`, `fb.watch`, `/share/v/` and `/share/r/` | Facebook's captions (auto-generated or uploaded); speech recognition otherwise |
| LinkedIn | `/posts/...`, `/feed/update/urn:li:activity:<id>` | LinkedIn's captions; speech recognition otherwise |
| Vimeo | `vimeo.com/<id>`, `player.vimeo.com/video/<id>`, unlisted `?h=` links | Vimeo's captions (uploaded or AI-generated); speech recognition otherwise |
| Dailymotion | `/video/<id>`, `dai.ly/<id>` | Dailymotion's subtitles; speech recognition otherwise |
| Loom | `/share/<id>`, `/embed/<id>` | Loom's own transcript |
| Wistia | `fast.wistia.net/embed/...`, `*.wistia.com/medias/<id>` | Wistia captions; speech recognition otherwise |
| Podcasts | RSS / Atom feeds, Apple Podcasts show links | speech recognition (episodes newest first) |
| Files | `.mp3 .m4a .mp4 .mov .webm .wav .flac .ogg .m3u8` and more | speech recognition |
| Any other page | a page with a video or audio player, og:video, an embedded YouTube / Vimeo / Wistia / Loom player, or a site yt-dlp knows (SoundCloud and many more) | the site's subtitles when it lists some; speech recognition otherwise |

### ⬆️ Output

One row per video. A real row from a test run (segments shortened):

```json
{
  "sourceUrl": "https://x.com/NASA/status/2113776971603689874",
  "url": "https://x.com/NASA/status/2113776971603689874",
  "platform": "x",
  "videoId": "2113776971603689874",
  "title": "We are not slowing down. 🚀

Our Artemis III mission will send four astronauts to low Earth orbit next year ...",
  "author": "NASA",
  "authorName": "NASA",
  "authorUrl": "https://x.com/NASA",
  "publishedAt": "2026-10-23T23:37:56.000Z",
  "durationSec": 59.89,
  "thumbnail": "https://pbs.twimg.com/media/HVWk812WIAAg_hz.jpg",
  "transcriptSource": "asr",
  "language": "en",
  "languageProbability": 0.992,
  "translatedToEnglish": false,
  "availableCaptionLanguages": [],
  "model": "whisper-tiny.en",
  "transcript": "The standard that we should continuously aspire to exceed, which is why we are bringing that intensity, that discipline, that engineering ownership back to NASA, because great nations do not remain great by being caretakers of this dream, but by continuously making history. ...",
  "wordCount": 179,
  "charCount": 1059,
  "segmentCount": 11,
  "segments": [
    { "start": 0, "end": 16, "text": "The standard that we should continuously aspire to exceed, which is why we are bringing that intensity, ..." }
  ],
  "audioSeconds": 59.9,
  "billedMinutes": 1,
  "chargedEvent": "audio-minute",
  "truncated": false,
  "note": null,
  "status": "ok",
  "errorCode": null,
  "error": null
}
```

A caption row looks the same with `transcriptSource: "captions"`, `captionLanguage` (e.g. `eng-US`, `en`, `en_US`), `captionAutoGenerated`, `billedMinutes: 0` and `chargedEvent: "caption-transcript"`.

A failed video is a free row:

```json
{ "sourceUrl": "https://www.instagram.com/reel/Dd9RyBWBVih/", "platform": "instagram", "status": "error", "errorCode": "NO_SPEECH", "error": "no speech recognised in 17 s of audio; not charged", "chargedEvent": null, "billedMinutes": 0 }
```

Error codes: `INVALID_URL`, `NOT_FOUND`, `PRIVATE`, `LOGIN_REQUIRED`, `NO_VIDEO`, `NO_AUDIO`, `NO_CAPTIONS` (captions-only mode), `NO_SPEECH`, `DOWNLOAD_FAILED`, `BLOCKED`, `LIMIT_REACHED`, `TIME_LIMIT`, `UNSUPPORTED`.

The run's key-value store holds `RUN_SUMMARY` (for runs of more than 3 videos, or with a failure or a skip): transcripts from captions and from speech recognition, audio minutes billed, failures by code, skipped videos, recognition speed.

### How much does it cost to transcribe videos?

Two prices, no start fee:

| Event | Price | When |
|---|---|---|
| `caption-transcript` | **$0.0018 per video** ($1.80 per 1,000) | the transcript is the platform's own caption track, any length |
| `audio-minute` | **$0.0054 per started audio minute** | speech recognition; minutes counted per video (a 45-second reel = 1 minute, a 2.5-minute video = 3) |

Examples from test runs:

| Run | Result | Charged |
|---|---|---|
| 1 YouTube video with captions + 1 11-second audio file (the default input) | 2 transcripts | $0.0018 + $0.0054 = $0.0072 |
| 16 mixed links (TikTok, Instagram, X, Facebook, LinkedIn, YouTube, Vimeo, Loom) | 14 transcripts, 2 free `NO_SPEECH` rows | 7 caption transcripts + 10 audio minutes = $0.0666 |
| 3 newest videos of a YouTube channel, captions only | 3 transcripts (9-20 minute videos) | $0.0054 |

Nothing is charged for errors, videos without speech, videos skipped by monitor mode, `publishedAfter` or your limits. Set **Max audio minutes per run** or a maximum charge per run in the run options to cap a run: the actor shortens the last video to fit and says so in its `note`.

### Run it on a schedule

Point the actor at a channel, playlist or podcast feed, switch on **Only new videos**, and add an [Apify schedule](https://docs.apify.com/platform/schedules) (daily or hourly). Each run transcribes only the videos the earlier runs did not deliver:

```json
{
  "urls": ["https://www.youtube.com/@NASA", "https://feeds.npr.org/510289/podcast.xml"],
  "monitorMode": true,
  "monitorStoreName": "nasa-and-npr",
  "maxVideosPerSource": 5,
  "publishedAfter": "7 days"
}
```

Through the API: `POST https://api.apify.com/v2/acts/TopApi~video-transcriber/runs?token=<token>` with the input above as the body; add `waitForFinish=300` for short jobs, or a webhook to get the dataset when the run ends. AI agents can call it through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp).

### Chain it after another scraper

Already scraping TikTok, Instagram, YouTube or X with another actor? Pass that run's dataset id as `datasetId` (or use Apify's *Connect actor* integration): every row's video link is found (`url`, `videoUrl`, `webVideoUrl`, `postUrl`, `shortCode`...) and transcribed.

### Limits

- **Public videos only.** Private, followers-only, age-restricted and removed videos come back as free rows (`PRIVATE`, `LOGIN_REQUIRED`, `NOT_FOUND`). No login, no cookies.
- **Instagram and X publish no captions** to visitors, so those videos always go through speech recognition.
- **Speech recognition is Whisper on CPU:** tiny.en / base / small. Clear speech comes out well; heavy music, crowd noise and several people talking at once lower accuracy. Pick `small` for difficult audio. Speaker labels (who said what) are not produced.
- **Speed:** about 0.15-0.35 s of processing per second of audio at the default 1 GB memory (the 16-video test run took 78-121 s, 493 s of audio recognised). More memory makes long files faster at the same price.
- **Long files:** `maxMinutesPerVideo` (default 120, up to 600) caps one video; podcasts are processed in 10-minute windows, and the part recognised before a time or charge limit is delivered and billed.
- **YouTube translations** (`translateToEnglish`, or a preferred language the video has no track in) come from YouTube when it serves them and from Whisper otherwise; Whisper translates only into English.
- Music-only clips return `NO_SPEECH` and are not charged.

### ❓ FAQ

#### How much does Video Transcriber cost?

$0.0018 per video transcribed from the platform's captions, $0.0054 per started audio minute of speech recognition, no start fee. Failures are free.

#### Which platforms does Video Transcriber support?

YouTube, TikTok, Instagram, X (Twitter), Facebook, LinkedIn, Vimeo, Dailymotion, Loom, Wistia, podcast feeds, Apple Podcasts, direct audio/video files, pages with an embedded video, and the sites yt-dlp supports (SoundCloud and many more).

#### Does Video Transcriber need an API key or a login?

No. Public videos only, no account, no cookies, no OpenAI or other API key.

#### What is the difference between captions and speech recognition?

Captions are the text the platform already shows under the video (creator-uploaded or the platform's own auto-captions): fast and billed once per video. Speech recognition listens to the audio with Whisper and is billed per minute. With the default setting you always get the cheaper one available.

#### Can Video Transcriber translate?

Yes: switch on **Translate to English**. The original language stays in `spokenLanguage`.

#### Can I get subtitles?

Yes: add `srt` and/or `vtt` to **Extra output**; word-level timings with `words`.

#### Can it transcribe a whole YouTube channel or podcast?

Yes: paste the channel, playlist or feed link and set **Max videos per channel / feed**. With **Only new videos** and a schedule, each run picks up only new uploads.

#### How accurate is the speech recognition?

On two English test clips checked against human captions, the word error rate was 9.0% and 10.6% with the default (tiny.en), 9.6% and 8.1% with `base`, and 5.1% with `small` on the first. Captions from the platform itself are used whenever they exist.

#### Why did a video come back as an error?

The `error` field says why: private or removed, no speech in the audio, a platform that refused the request, or a link that is not a video. Error rows are never charged.

#### Can I use Video Transcriber through the API or with AI agents?

Yes: the Apify API, the Python and JavaScript clients, Make, Zapier, n8n, webhooks, and the Apify MCP server for agents.

#### Your feedback

Found a link that should work and does not? Open an issue on the actor's page with the URL and we will look at it.

# Actor input Schema

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

One link per line: YouTube (videos, Shorts, channels, playlists), TikTok, Instagram reels/posts, X posts, Facebook videos/reels, Vimeo, Dailymotion, Loom, Wistia, LinkedIn posts, podcast feeds, Apple Podcasts shows, direct .mp3/.mp4/.m3u8 files, or any other page with a video.

## `urlsFromFile` (type: `string`):

Link to a public .txt or .csv file; every http(s) URL in it is transcribed (e.g. a Google Sheet exported as CSV).

## `datasetId` (type: `string`):

The dataset of a finished scraper run (TikTok, Instagram, YouTube, X...): the video URL in each row is found and transcribed, up to 10,000 rows.

## `datasetItems` (type: `array`):

Paste rows from any scraper's output instead of a dataset ID; a video URL is looked for in fields like url, videoUrl, webVideoUrl, postUrl.

## `transcriptSource` (type: `string`):

Captions first reads the platform's own caption track when the video has one (billed per video) and runs speech recognition otherwise (billed per audio minute).

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

"auto" detects it. Or a code / name (en, es, pt, de, ja, "Spanish") to force speech recognition and to prefer that caption track. Setting it helps on short clips.

## `preferredCaptionLanguages` (type: `array`):

Caption tracks to pick, in order, when a video lists several (e.g. en, es). Empty = the video's own spoken-language track.

## `translateToEnglish` (type: `boolean`):

Return English text whatever is spoken: an English caption track or YouTube's own translation when there is one, Whisper's translation otherwise. The spoken language stays in spokenLanguage.

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

Whisper model for videos without captions. Auto: English audio goes to tiny.en (as accurate as base on English, twice as fast), other languages to base. Small is the most accurate on accents, noise and non-English speech, about 3x slower than base. Same price per minute.

## `minWords` (type: `integer`):

A transcript with fewer words is returned as a free row (NO_SPEECH) and never charged; music-only clips leave 0-2 stray words.

## `publishedAfter` (type: `string`):

Only videos / episodes published on or after this date (2026-10-01) or within a period ("7 days", "24 hours"). Videos whose date is unknown are kept.

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

Speech recognition stops after this many minutes of one video (the row says it was truncated); caption transcripts are never cut.

## `monitorMode` (type: `boolean`):

Skip every video an earlier run with the same monitor name already transcribed (skipped videos are not charged).

## `monitorStoreName` (type: `string`):

Runs with the same name share the list of transcribed videos (a named key-value store on your account). Letters, digits, dashes.

## `outputFormats` (type: `array`):

Plain text is always returned. Add timed segments, word timings (speech recognition only), SubRip / WebVTT subtitles, a "\[0:03 - 0:07] text" transcript, or RAG chunks.

## `chunkSize` (type: `integer`):

Target size of one RAG chunk; chunks end on segment boundaries and keep their start and end time.

## `maxVideosPerSource` (type: `integer`):

How many of the newest videos to take from each YouTube channel or playlist and each podcast feed.

## `maxResults` (type: `integer`):

Stop after this many transcripts (0 = no limit). Error rows do not count.

## `maxTotalMinutes` (type: `integer`):

Stop speech recognition once this many audio minutes were billed in the run (0 = no limit). Caption transcripts still run.

## `includeFailedRows` (type: `boolean`):

Return a free row with errorCode and error for every video that could not be transcribed (private, removed, no speech...).

## `maxConcurrency` (type: `integer`):

Videos resolved and downloaded at the same time (speech recognition runs one at a time).

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

Optional. Leave empty: the actor goes direct first and moves to Apify datacenter, then residential proxy only for a site that refuses it. Set your own to route every proxied request through it.

## Actor input object example

```json
{
  "urls": [
    "https://www.youtube.com/watch?v=jNQXAC9IVRw",
    "https://github.com/openai/whisper/raw/main/tests/jfk.flac"
  ],
  "transcriptSource": "auto",
  "language": "auto",
  "translateToEnglish": false,
  "model": "auto",
  "minWords": 1,
  "maxMinutesPerVideo": 120,
  "monitorMode": false,
  "monitorStoreName": "video-transcriber-monitor",
  "outputFormats": [
    "segments"
  ],
  "chunkSize": 1000,
  "maxVideosPerSource": 10,
  "maxResults": 0,
  "maxTotalMinutes": 0,
  "includeFailedRows": true,
  "maxConcurrency": 4
}
```

# Actor output Schema

## `results` (type: `string`):

One item per video: transcript, timed segments, language, source (captions or speech recognition), title, author, duration, billed minutes; failed videos as free rows with an errorCode.

## `summary` (type: `string`):

Transcripts from captions vs speech recognition, audio minutes billed, failures by code, skipped videos, recognition speed. Not written for a run of 3 or fewer videos that delivered every one.

# 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.youtube.com/watch?v=jNQXAC9IVRw",
        "https://github.com/openai/whisper/raw/main/tests/jfk.flac"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("topapi/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.youtube.com/watch?v=jNQXAC9IVRw",
        "https://github.com/openai/whisper/raw/main/tests/jfk.flac",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("topapi/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.youtube.com/watch?v=jNQXAC9IVRw",
    "https://github.com/openai/whisper/raw/main/tests/jfk.flac"
  ]
}' |
apify call topapi/video-transcriber --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,topapi/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/57oEfg4RMeWBS3ZYA/builds/nYz1HTR6ARNl6XMgS/openapi.json
