# Vimeo Transcript Scraper — Captions to TXT, SRT & VTT (`scrapersdelight/vimeo-transcript-scraper`) Actor

Extract any public Vimeo video's captions and transcript — no login, no ASR. By video URL/ID or a page that links Vimeo videos: transcript text, timestamped segments & SRT/VTT, plus title, owner and duration, from Vimeo's own caption tracks. $2 per 1,000 videos.

- **URL**: https://apify.com/scrapersdelight/vimeo-transcript-scraper.md
- **Developed by:** [Scrapers Delight](https://apify.com/scrapersdelight) (community)
- **Categories:** Videos, AI, Automation
- **Stats:** 80 total users, 12 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 per record returneds

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

## 🎬 Vimeo Video Transcript & Caption Scraper

**Get any public Vimeo video's captions as a transcript — no login, no AI transcription. This actor reads the video's own caption tracks: full transcript text, timestamped segments, and SRT/VTT, plus title, owner, and duration. Pass video URLs or a page that links Vimeo videos.**

It reads existing captions, so there's no speech-to-text compute — fast and cheap.

***

### What does it do?

For each Vimeo video (by URL/ID or harvested from a page) it returns:

- 📝 **Full transcript** (plain text) — always included
- ⏲️ **Timestamped segments** — `{start, end, text}`
- 🎬 **SRT / VTT subtitles**
- 🏷️ **Title, owner, duration, available languages**

No ASR, no API key — it reads the video's caption tracks (uploaded by the owner, or auto-generated by Vimeo).

***

### What data does it extract?

For every video: `video_id`, `url`, `title`, `owner`, `owner_url`, `duration_sec`, `language`, `caption_auto_generated`, `available_languages[]`, `transcript`, `segments[]`, `srt`, `vtt`, `segment_count`, `scraped_at`.

`caption_auto_generated` is `true` when the transcript comes from Vimeo's own auto-generated captions (language codes like `en-x-autogen`) rather than a track the uploader added. When both exist for the chosen language, the uploader's track is used.

***

### Who is it for?

- 🎥 **Creators & agencies** repurposing Vimeo videos into text and subtitles.
- ♿ **Accessibility / localization** teams pulling captions.
- 🤖 **AI / RAG builders** turning hosted video into searchable content.

***

### How to use it (step by step)

1. Click **Try for free**.
2. Paste **video URLs/IDs** — or a **page URL** that links Vimeo videos.
3. *(Optional)* set a **language** and extra **formats** (`srt`, `vtt`, `segments`).
4. Click **Start**, open the **Dataset** tab to view/export.

#### Quick start

```json
{ "videoUrls": ["https://vimeo.com/76979871"], "transcriptFormats": ["txt", "srt"] }
```

***

### Input

| Field | What it does |
|-------|--------------|
| `videoUrls` | Vimeo video URLs / IDs |
| `pageUrl` | a page linking Vimeo videos to harvest IDs from |
| `language` | caption language (or `auto`) |
| `transcriptFormats` | `txt` · `segments` · `srt` · `vtt` |
| `maxVideos` | hard cap per run — protects against a runaway bill (default 50; 0 = unlimited) |
| `proxyConfiguration`, `requestConcurrency` | optional fallback proxy (Vimeo is called directly first) + parallelism |

***

### Output

Each video is one dataset record (fields above). Export to **JSON, CSV, Excel, HTML, or RSS**, or fetch via the **Apify API**. Videos that are embed-restricted or have no captions are returned with a `note` (not faked).

***

### How much does it cost?

Pay-per-event, with **no transcription compute** — and you're charged **only for videos that actually return a transcript**. Videos with no captions or that are privacy-restricted are still delivered so you can see what failed, but they're **free**.

| Event | What it covers |
|-------|----------------|
| `lot-scraped` | each video that returns a transcript (one charge per transcript) |

*(The per-event price is set on the actor's pricing page.)*

***

### How does it work without AI transcription?

Vimeo's player configuration lists each video's caption tracks (`.vtt` files — uploaded by the owner, or auto-generated by Vimeo). This actor reads those caption tracks — it does **not** run speech-to-text, so there's no GPU/compute cost. A transcript exists only if the video has a caption track; privacy-restricted videos are reported as unavailable.

***

### Is it legal to scrape Vimeo captions?

This actor reads **publicly embeddable** Vimeo videos' own caption tracks. The video content is copyrighted by its owner. Scraping public data is generally legal, but **you are responsible for your use — review Vimeo's and the publisher's terms; don't redistribute captions you're not licensed to.**

***

### FAQ

**Why do some videos return no transcript?**
Either the video is privacy-restricted (reported as such), or it has no caption track at all — neither uploaded nor auto-generated by Vimeo.

**Is there a Whisper/ASR step?**
No — it reads Vimeo's caption tracks, so it's fast and cheap.

**Can I get subtitles?**
Yes — add `srt` and/or `vtt` to `transcriptFormats`.

**How do I export?**
JSON, CSV, Excel, HTML, or RSS from the Dataset tab, or via the Apify API.

***

### Feedback

Want multi-language pulls or showcase/channel crawling? Open an issue on the actor.

# Actor input Schema

## `videoUrls` (type: `array`):

Vimeo video URLs (https://vimeo.com/{id}) or bare numeric IDs.

## `pageUrl` (type: `string`):

Any page that links Vimeo videos — the actor harvests every vimeo.com/{id} it finds (respects the Max videos cap).

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

Caption language code (e.g. en) or 'auto' for the first available (prefers English).

## `transcriptFormats` (type: `array`):

Which transcript representations to include. Plain text is always included.

## `maxVideos` (type: `integer`):

Hard cap on videos per run — protects you from a runaway bill when harvesting a page. 0 = unlimited.

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

Optional. Vimeo's player endpoints are called directly; a proxy set here is only used to retry a request whose direct attempt failed.

## `requestConcurrency` (type: `integer`):

Max parallel video fetches.

## `diagnose` (type: `boolean`):

Dev only. Logs the parsed first record, then exits.

## Actor input object example

```json
{
  "videoUrls": [
    "https://vimeo.com/76979871"
  ],
  "language": "auto",
  "transcriptFormats": [
    "txt"
  ],
  "maxVideos": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "requestConcurrency": 5,
  "diagnose": false
}
```

# Actor output Schema

## `transcripts` (type: `string`):

The dataset of transcribed Vimeo videos (one item per video).

# 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 = {
    "videoUrls": [
        "https://vimeo.com/76979871"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapersdelight/vimeo-transcript-scraper").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 = { "videoUrls": ["https://vimeo.com/76979871"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapersdelight/vimeo-transcript-scraper").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 '{
  "videoUrls": [
    "https://vimeo.com/76979871"
  ]
}' |
apify call scrapersdelight/vimeo-transcript-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapersdelight/vimeo-transcript-scraper"
        }
    }
}
```

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/9vHRf4e3JmQsmYegI/builds/A8500M4FmB9BSfwSa/openapi.json
