# Wisprs — AI Transcription & Subtitle Generator (`toshiusklay/wisprs-transcription`) Actor

Transcribe any YouTube video, podcast, TikTok, or audio/video URL to text. Export as SRT, VTT, TXT, JSON, Markdown, or DOCX. Generate AI summaries, chapters, show notes, and Twitter threads. 100+ languages. No Wisprs account needed.

- **URL**: https://apify.com/toshiusklay/wisprs-transcription.md
- **Developed by:** [Gitonga Mwaura](https://apify.com/toshiusklay) (community)
- **Categories:** AI, Automation
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $15.00 / 1,000 audio minutes

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Wisprs — AI Transcription & Subtitle Generator (YouTube, Podcast, Audio)

Submit any YouTube video, podcast episode, or audio URL and get back a full text transcript, SRT/VTT subtitles, speaker-labeled segments, and structured content like show notes, chapters, or Twitter/X threads — saved to your Apify Dataset automatically.

The Wisprs Transcription Actor is powered by the [Wisprs API](https://wisprs.co), a production-grade async voice processing engine that transcribes audio from any publicly accessible URL. Unlike caption-scraping actors that fail on 30–40% of videos (music, Shorts, unlisted), Wisprs uses Whisper-based transcription and yt-dlp to cover 100% of video and audio URLs. Accuracy is excellent on clear audio; results vary by language, accent, and recording quality.

***

### What does this Actor do?

1. Takes a list of YouTube, podcast, or audio/video URLs from your `startUrls` input
2. Submits each URL to the Wisprs transcription API (async job queue — no timeouts)
3. Polls until each job completes (typically 1–3 minutes per 15-minute video)
4. Exports the transcript in your chosen formats: TXT, SRT, VTT, JSON, or Markdown
5. Optionally generates structured content from the transcript via the Wisprs repurpose engine — podcast show notes, timestamped chapters, guest quotes, Twitter/X threads, or blog posts
6. Saves one dataset row per URL — ready for downstream automation

***

### How do I transcribe a YouTube video to SRT subtitles?

Set `exportFormats` to include `"srt"` and run:

```json
{
  "startUrls": [{ "url": "https://www.youtube.com/watch?v=YOUR_VIDEO_ID" }],
  "language": "auto",
  "exportFormats": ["srt", "txt"],
  "repurposeMode": "none"
}
```

Each dataset row will contain the full SRT file in `transcript_srt` and plain text in `transcript_txt`. Works for captionless videos, unlisted videos, and anything with audio.

***

### How do I transcribe a podcast episode with speaker labels?

Enable `diarize: true` to get speaker-attributed segments:

```json
{
  "startUrls": [{ "url": "https://your-podcast-host.com/episode.mp3" }],
  "language": "auto",
  "diarize": true,
  "exportFormats": ["txt", "srt", "vtt"]
}
```

Speakers are labeled `"Host"`, `"Guest"`, `"Speaker 1"`, `"Speaker 2"`, etc. Works best on clear two-speaker recordings; handles up to 6–8 speakers on clean audio.

***

### How do I generate show notes, chapters, or a Twitter thread from a video?

Set `repurposeMode` to your desired output and the Actor transcribes first, then generates content from the real transcript:

```json
{
  "startUrls": [{ "url": "https://www.youtube.com/watch?v=YOUR_VIDEO_ID" }],
  "exportFormats": ["txt", "srt"],
  "repurposeMode": "show-notes"
}
```

Available modes: `summary`, `show-notes`, `thread`, `chapters`, `quotes`, `blog`.

***

### How do I batch transcribe an entire podcast back-catalog?

Add all episode URLs to `startUrls`. The Actor processes them sequentially, saving each result to the Dataset as it completes — no timeout, no manual polling required:

```json
{
  "startUrls": [
    { "url": "https://anchor.fm/.../episode-1.mp3" },
    { "url": "https://anchor.fm/.../episode-2.mp3" },
    { "url": "https://anchor.fm/.../episode-3.mp3" }
  ],
  "exportFormats": ["txt", "md"],
  "diarize": true
}
```

***

### How do I use this with n8n, Make, or Zapier?

Pass a `webhookUrl` in your input. The Wisprs API will POST the completed job result to your endpoint as each transcription finishes — no need to poll from your workflow:

```json
{
  "startUrls": [{ "url": "https://www.youtube.com/watch?v=YOUR_VIDEO_ID" }],
  "exportFormats": ["txt", "srt"],
  "webhookUrl": "https://your-n8n-instance.com/webhook/YOUR_HOOK_ID"
}
```

The webhook payload includes `transcriptionId`, `status`, `durationSeconds`, `language`, and the full transcript text.

***

### Using with AI agents (MCP)

This Actor is published on the Apify Store and automatically available as an MCP tool. AI agents using Claude Desktop, LangChain, CrewAI, or any MCP-compatible framework can discover and call this Actor with a single Apify MCP configuration — no custom integration required.

***

### What data does the Actor return?

Each dataset row includes:

| Field                   | Description                                                        |
| ----------------------- | ------------------------------------------------------------------ |
| `url`                   | The submitted URL                                                  |
| `jobId`                 | Wisprs transcription ID (integer)                                  |
| `transcriptionId`       | Same as `jobId` — the transcription ID                             |
| `status`                | `completed` or `failed`                                            |
| `durationSeconds`       | Audio/video duration in seconds                                    |
| `language`              | ISO 639-1 code of the detected language (e.g. `"en"`, `"es"`)     |
| `transcript_txt`        | Full plain-text transcript                                         |
| `transcript_srt`        | SRT subtitle file content                                          |
| `transcript_vtt`        | WebVTT subtitle file content                                       |
| `transcript_json`       | Word-level timestamps in JSON                                      |
| `transcript_md`         | Transcript in Markdown format                                      |
| `repurposed_show-notes` | Structured show notes (summary, chapters, quotes)                  |
| `repurposed_thread`     | Twitter/X thread text                                              |
| `repurposed_blog`       | Markdown blog post or LinkedIn article                             |
| `repurposed_summary`    | 2–4 sentence summary                                               |
| `repurposed_chapters`   | Timestamped chapter markers                                        |
| `repurposed_quotes`     | Top verbatim quotes                                                |

***

### Wisprs vs caption-scraping transcription actors

| Feature                                 | Wisprs             | Caption scrapers     |
| --------------------------------------- | ------------------ | -------------------- |
| Works on captionless videos             | Yes                | No                   |
| Works on YouTube Shorts                 | Yes                | Partial              |
| Works on private-link Loom / mp3 / mp4  | Yes                | No                   |
| SRT / VTT subtitle export               | Yes                | Text only (usually)  |
| Speaker diarization                     | Yes                | No                   |
| Repurpose to thread / blog / chapters   | Yes                | No                   |
| Webhook per completed job               | Yes                | No                   |
| 100+ languages                          | Yes                | ~20–30 typically     |

***

### How much does it cost?

Pricing is pay-per-event:

- **$0.005** per transcription submitted (one-time per URL)
- **$0.015 per audio minute** processed (e.g. a 30-minute episode = $0.45)
- **$0.075** per repurpose result generated (show notes, thread, etc.)

**Example: 10 podcast episodes averaging 45 minutes each**

- Submission: 10 × $0.005 = $0.05
- Audio minutes: 10 × 45 × $0.015 = $6.75
- Show notes (optional): 10 × $0.075 = $0.75
- **Total: ~$7.55** for 10 complete episodes with show notes

The Apify free plan includes $5 of monthly credits — enough to transcribe 5–6 short videos at no cost.

***

### Input

| Field                 | Type    | Required | Default         | Description                                                    |
| --------------------- | ------- | -------- | --------------- | -------------------------------------------------------------- |
| `startUrls`           | Array   | Yes      | —               | YouTube, podcast, or audio/video URLs                          |
| `apiKey`              | String  | No       | —               | Your Wisprs API key (optional — publisher key used by default) |
| `language`            | String  | No       | `auto`          | ISO 639-1 code or `auto`                                       |
| `diarize`             | Boolean | No       | `false`         | Label speakers (host vs guest)                                 |
| `exportFormats`       | Array   | No       | `["txt","srt"]` | txt, srt, vtt, json, md                                        |
| `repurposeMode`       | String  | No       | `none`          | none, summary, show-notes, thread, chapters, quotes, blog      |
| `webhookUrl`          | String  | No       | —               | Callback URL per completed job                                 |
| `maxPollSeconds`      | Integer | No       | `900`           | Max wait per job (60–3600s)                                    |
| `pollIntervalSeconds` | Integer | No       | `10`            | Status check interval (5–60s)                                  |

***

### Supported URLs

- YouTube videos, Shorts, and playlist-linked videos
- Direct audio: mp3, wav, m4a, ogg, flac
- Direct video: mp4, webm, mov
- Podcast RSS episode links
- TikTok, Loom, Vimeo, and most public video/audio hosts

***

### Language support

100+ languages with automatic detection. The detected language appears in each dataset row as `language`. Pass a specific ISO 639-1 code (`"en"`, `"es"`, `"fr"`) to skip auto-detection and speed up processing slightly for known-language content.

***

### Related Actors

- [Wisprs — Podcast Show Notes Generator](https://apify.com/toshiusklay/wisprs-podcast-show-notes) — podcast episodes → show notes, chapters, guest quotes with speaker diarization
- [Wisprs — YouTube Content Repurposer](https://apify.com/toshiusklay/wisprs-youtube-repurposer) — YouTube → Twitter thread, LinkedIn article, blog post, chapters
- [Wisprs — Social Media Transcriber](https://apify.com/toshiusklay/wisprs-social-media-transcriber) — TikTok, Instagram Reels, YouTube Shorts at $1.00/1k

***

### FAQ

**Do I need an OpenAI API key or a Wisprs account?**
No. No external API key or account required. The Actor handles authentication internally — you pay only via Apify credits.

**Does it work for videos without captions?**
Yes. Unlike caption-scraping actors, Wisprs transcribes the audio directly using Whisper. It covers captionless videos, music videos, private-link Loom recordings, and anything with audio.

**Is there a video length limit?**
No hard limit. The async job queue handles videos of any length. A 90-minute webinar typically completes in 5–10 minutes.

**What if a job fails?**
The dataset row will have `status: "failed"`. Check the Actor logs for details (unsupported format, private video, no audio, etc.).

***

### Support

- Documentation: [wisprs.co/docs](https://wisprs.co/docs)
- Email: tosh@belvadigital.com
- Issues: report via the Apify Actor page

***

*Submit a URL. Get subtitles, transcripts, and show notes. Done.*

# Actor input Schema

## `startUrls` (type: `array`):

List of YouTube, podcast episode, or direct audio/video URLs to transcribe. Supports mp3, mp4, wav, m4a, YouTube, TikTok, Loom, and most video/audio hosts.

## `apiKey` (type: `string`):

Your Wisprs API key. Get one free at https://wisprs.co/developer. Required to run this Actor.

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

ISO 639-1 language code (e.g. 'en', 'es', 'fr'). Leave blank or set 'auto' to detect automatically.

## `diarize` (type: `boolean`):

Label who is speaking in the transcript (host vs guest). Useful for podcasts and interviews.

## `exportFormats` (type: `array`):

Transcript formats to include in the dataset output.

## `repurposeMode` (type: `string`):

Optionally generate structured content from the transcript. 'none' to skip. 'show-notes' for podcast show notes with chapters and quotes. 'thread' for a Twitter/X thread. 'blog' for a Markdown blog post. 'summary' for a 2–4 sentence summary. 'chapters' for timestamped chapters. 'quotes' for top verbatim quotes.

## `webhookUrl` (type: `string`):

URL to POST a completion notification to for each transcription job. Leave blank to poll instead.

## `maxPollSeconds` (type: `integer`):

Maximum time to wait for each transcription job to complete. Default 900 seconds (15 minutes).

## `pollIntervalSeconds` (type: `integer`):

How often to check job status. Default 10 seconds.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw"
    }
  ],
  "language": "auto",
  "diarize": false,
  "exportFormats": [
    "txt",
    "srt"
  ],
  "repurposeMode": "none",
  "maxPollSeconds": 240,
  "pollIntervalSeconds": 10
}
```

# Actor output Schema

## `url` (type: `string`):

The submitted media URL

## `jobId` (type: `string`):

Wisprs transcription job ID

## `transcriptionId` (type: `string`):

Wisprs transcription ID — same value as jobId

## `status` (type: `string`):

Job outcome: completed or failed

## `durationSeconds` (type: `string`):

Audio/video duration in seconds

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

ISO 639-1 language code detected in the audio (e.g. en, es, fr)

## `transcript_txt` (type: `string`):

Full plain-text transcript

## `transcript_srt` (type: `string`):

SRT subtitle file content with timestamps

## `transcript_vtt` (type: `string`):

WebVTT subtitle file content

## `transcript_json` (type: `string`):

Word-level timestamps as JSON

## `transcript_md` (type: `string`):

Transcript formatted in Markdown

## `repurposed_summary` (type: `string`):

2–4 sentence summary (repurposeMode=summary)

## `repurposed_thread` (type: `string`):

Twitter/X thread as an array of tweet objects (repurposeMode=thread)

## `repurposed_blog` (type: `string`):

Markdown blog post or LinkedIn article (repurposeMode=blog)

## `repurposed_chapters` (type: `string`):

Timestamped chapter markers (repurposeMode=chapters)

## `repurposed_quotes` (type: `string`):

Top verbatim quotes with speaker attribution and timestamps (repurposeMode=quotes)

## `error` (type: `string`):

Error code if the run failed (e.g. missing\_api\_key, submit\_failed)

## `message` (type: `string`):

Human-readable error 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 = {
    "startUrls": [
        {
            "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("toshiusklay/wisprs-transcription").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 = { "startUrls": [{ "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw" }] }

# Run the Actor and wait for it to finish
run = client.actor("toshiusklay/wisprs-transcription").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw"
    }
  ]
}' |
apify call toshiusklay/wisprs-transcription --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=toshiusklay/wisprs-transcription",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/yslIrM00tN6dYrWH9/builds/K9755bqA69HRGXcBg/openapi.json
