# Twitter Video Transcripts Scraper (`automation-lab/x-twitter-video-transcript-scraper`) Actor

Turn public X video posts into transcript text, timestamped segments, language, author context, media metadata, engagement counts, and source provenance.

- **URL**: https://apify.com/automation-lab/x-twitter-video-transcript-scraper.md
- **Developed by:** [Automation Lab](https://apify.com/automation-lab) (community)
- **Categories:** Social media, Videos, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.55 / 1,000 transcript extracteds

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?

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

## Twitter Video Transcripts Scraper

Turn supplied public X posts into structured **twitter video transcripts**.
Each successful record contains full speech text, detected language, timestamped segments,
post identity, author context, media metadata, engagement counts, and source provenance.

Use the Actor for recurring social-content monitoring, quote review, research datasets,
accessibility workflows, and downstream AI analysis.
It works with known public X/Twitter status URLs and does not require an X login.

### What does Twitter Video Transcripts Scraper do?

The Actor accepts public X post URLs containing spoken video and:

1. validates and normalizes each URL;
2. obtains a fresh public X guest session;
3. resolves the post and attached media through X's public web data flow;
4. checks video duration and download safety limits;
5. downloads only a low-bandwidth audio stream for processing;
6. runs speech recognition inside the Actor container;
7. returns one typed dataset record per successful post;
8. charges the transcript event only after non-empty transcript text is produced.

Supported URL forms include:

- `https://x.com/username/status/123456789`
- `https://twitter.com/username/status/123456789`
- equivalent `www` and mobile Twitter status URLs

The Actor does not search X, crawl profiles, fetch replies, or access private posts.

### Who is it for?

#### Social media analysts

Convert saved X video posts into searchable text.
Schedule the same URL list to support recurring content monitoring and retain current source context.

#### Newsrooms and researchers

Create source-linked transcript datasets from public statements and interviews.
Keep the post ID, author, publication time, engagement snapshot, video ID, and canonical URL beside every transcript.

#### Marketing and content teams

Review spoken campaign messages, product announcements, and podcast clips.
Use segment timestamps to locate an approximate quote position in the source video.

#### Developers and data teams

Send structured records to a warehouse, spreadsheet, vector database, LLM pipeline, or alerting workflow.
Use `postId` and `canonicalUrl` as stable join keys.

### Why use this Actor?

- **Timestamped speech:** ordered segments include start, end, and text.
- **X-specific provenance:** every record retains the supplied URL, normalized post URL, post ID, media ID, author, and post text.
- **Media context:** duration, dimensions, thumbnail, and an observed public media variant are included when exposed.
- **Engagement snapshot:** views, likes, reposts, and replies are returned when X exposes them.
- **Language control:** detect speech automatically or provide a language code.
- **No external speech API:** transcription runs locally inside the Actor.
- **Bounded processing:** URLs are processed sequentially, with duration, batch, and media-size limits.
- **Success-based item charging:** private, deleted, silent, non-video, or failed posts do not receive a transcript charge.

### What data can I extract?

| Field | Meaning |
| --- | --- |
| `sourceUrl` | Original URL supplied in the input |
| `canonicalUrl` | Normalized x.com post URL |
| `postId` | Stable X post ID |
| `mediaId` | Identifier of the resolved video media |
| `authorName` | Public author display name |
| `authorUsername` | Public X username |
| `authorUrl` | Canonical author profile URL |
| `postText` | Text accompanying the video post |
| `postedAt` | Source publication timestamp |
| `durationSeconds` | Video duration reported by X |
| `width`, `height` | Highest-quality exposed video dimensions |
| `thumbnailUrl` | Public video thumbnail URL |
| `mediaUrl` | Public video variant observed during resolution |
| `viewCount` | Views exposed at extraction time |
| `likeCount` | Likes exposed at extraction time |
| `repostCount` | Reposts exposed at extraction time |
| `replyCount` | Replies exposed at extraction time |
| `transcript` | Full normalized speech transcript |
| `language` | Detected or requested language code |
| `languageProbability` | Detection confidence from zero to one |
| `segments` | Ordered `{ startSeconds, endSeconds, text }` objects |
| `segmentCount` | Number of timestamped segments |
| `wordCount` | Whitespace-delimited transcript word count |
| `extractionMethod` | Media-resolution and transcription provenance |
| `transcriptionModel` | Speech model identifier |
| `transcribedAt` | ISO completion timestamp |

X CDN media and thumbnail URLs may expire.
Use `postId` and `canonicalUrl` as durable provenance rather than permanent media storage.
Counts can be null or change after a run.

### How to get started

1. Open the Actor input page.
2. Add one or more public X/Twitter status URLs containing videos.
3. Leave `language` on `auto`, or provide a language such as `en`, `es`, `fr`, or `ja`.
4. Set the maximum accepted video duration.
5. Start the run.
6. Open the default dataset and inspect the Twitter video transcripts view.
7. Export JSON, CSV, Excel, XML, or RSS, or consume the dataset through the API.

Start with one known public video.
After confirming the output fits your workflow, add up to five URLs or save the input as an Apify task.

### Input parameters

#### `startUrls`

Required array of public X or Twitter post URLs.
Every URL must use a `/username/status/numeric-id` path and contain downloadable public video audio.
Duplicate post IDs are processed once.

Private, deleted, age-restricted, login-only, image-only, and unsupported URLs fail explicitly.
The Actor does not accept profile pages, searches, lists, spaces, or arbitrary direct media files.

#### `maxItems`

Maximum number of unique supplied URLs processed in one run.
The accepted range is 1–5 and the default is 3.
This controls a bounded URL batch; it is not a search-result limit.

#### `language`

Use `auto` to detect the spoken language.
Alternatively enter a two- or three-letter code such as `en`, `es`, `fr`, `ja`, or `deu`.
A correct hint can improve short-clip recognition.

#### `maxVideoDurationSeconds`

Reject videos longer than this threshold before speech recognition.
The accepted range is 10–1800 seconds and the default is 600.
Use a lower limit for predictable short-form monitoring runs.

### Example input

```json
{
  "startUrls": [
    { "url": "https://x.com/NASA/status/2087601629486813499" }
  ],
  "maxItems": 1,
  "language": "en",
  "maxVideoDurationSeconds": 600
}
```

For recurring monitoring, save the URL list as an Apify task and attach a schedule.
Each run creates a new dataset with current source metadata and a fresh transcription timestamp.

### Example output

This shortened example reflects current real output shape while omitting most segments:

```json
{
  "sourceUrl": "https://x.com/NASA/status/2087601629486813499",
  "canonicalUrl": "https://x.com/NASA/status/2087601629486813499",
  "postId": "2087601629486813499",
  "mediaId": "2087601144964984832",
  "authorName": "NASA",
  "authorUsername": "NASA",
  "postedAt": "2026-02-02T17:30:13.000Z",
  "durationSeconds": 227.562,
  "language": "en",
  "languageProbability": 0.999,
  "transcript": "Talking to us live from Iceland...",
  "segments": [
    {
      "startSeconds": 0,
      "endSeconds": 4.12,
      "text": "Talking to us live from Iceland."
    }
  ],
  "segmentCount": 68,
  "wordCount": 683,
  "extractionMethod": "x-public-graphql-yt-dlp-local-ai-speech-to-text",
  "transcriptionModel": "faster-whisper-tiny",
  "transcribedAt": "2026-09-14T15:30:00.000Z"
}
```

Transcript accuracy varies with music, accents, compression, overlapping speakers, background noise, and audio quality.
Review consequential quotations against the source video before publishing them.

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

Pricing uses two events:

- **Run started:** $0.005 once per run.
- **Video transcript:** tiered per successful non-empty transcript.

At the Bronze tier, the transcript event is **$0.017584 per successful video**.
A run with one successful video is approximately $0.022584.
A run with five successful videos is approximately $0.09292.
Failed URLs do not receive a transcript event, although the one-time start event still applies.

Higher Apify subscription tiers receive lower per-transcript event prices.
The Console displays the active tier before a run starts.
Runtime, media resolution, and local speech recognition are covered by the Actor's pay-per-event price.

### Monitoring and automation workflows

#### Recurring public-post review

Save a stable list of public X post URLs as an Apify task.
Run it daily or weekly and compare datasets by `postId` and `transcribedAt`.
The Actor does not discover new posts or send alerts by itself.

#### Editorial quote review

Search `transcript` for a phrase.
Use `segments` to find its approximate position and open `canonicalUrl` for verification.

#### Spreadsheet export

Send author, source URL, language, duration, transcript, and engagement columns to Google Sheets.
Keep the full segments array as JSON when a flat sheet is not suitable.

#### LLM and semantic search

Chunk timestamped segments and retain post/media IDs as metadata.
Load the chunks into a vector database or summarization pipeline.
Summarization, translation, embeddings, and classification are downstream steps, not Actor output.

### Run with the Apify API

Replace `YOUR_TOKEN` with your Apify API token.
The sync endpoint starts the Actor and returns default dataset items.

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~x-twitter-video-transcript-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "startUrls": [{"url":"https://x.com/NASA/status/2087601629486813499"}],
    "maxItems": 1,
    "language": "en",
    "maxVideoDurationSeconds": 600
  }'
```

#### JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/x-twitter-video-transcript-scraper').call({
  startUrls: [{ url: 'https://x.com/NASA/status/2087601629486813499' }],
  maxItems: 1,
  language: 'en',
  maxVideoDurationSeconds: 600,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].transcript);
```

#### Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("automation-lab/x-twitter-video-transcript-scraper").call(run_input={
    "startUrls": [{"url": "https://x.com/NASA/status/2087601629486813499"}],
    "maxItems": 1,
    "language": "en",
    "maxVideoDurationSeconds": 600,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items[0]["transcript"])
```

### Use with MCP and AI agents

Connect this Actor to Claude Code through Apify MCP:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/x-twitter-video-transcript-scraper"
```

#### Claude Desktop

Add the following remote MCP server configuration to Claude Desktop.

#### Cursor

Use the same remote server URL in Cursor's MCP settings.

#### VS Code

Add the same remote MCP server to your VS Code MCP configuration.

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/x-twitter-video-transcript-scraper"
    }
  }
}
```

Example prompts:

- “Transcribe this public X video and return every timestamped segment.”
- “Run the X video transcript Actor for these three post URLs and compare the spoken claims.”
- “Extract transcript text, author, post time, duration, and engagement metadata from this X video.”

Provide only public URLs you are authorized to process.

### Reliability, limits, and failure behavior

- A run accepts at most five unique post URLs.
- Videos longer than the configured limit are rejected before transcription.
- Media downloads are limited to 80 MB.
- URLs run sequentially to keep CPU and memory predictable.
- The current transcription model favors speed and cost over studio-grade accuracy.
- Public X web endpoints can change; a source-resolution failure is returned as an explicit failed run.
- If one URL fails after earlier successes, successful records remain in the dataset and only those records receive transcript events.
- X media URLs are temporary and should not be treated as permanent archives.
- Silent videos fail because they cannot produce a useful speech transcript.

### Troubleshooting

#### Why did my post produce no transcript?

Confirm the post is public, still available, contains a video with audible speech, and is shorter than your duration limit.
Image posts, GIF-only posts, private accounts, removed posts, and region/age restrictions are outside scope.

#### Why did the run fail after saving some records?

The Actor preserves useful earlier transcripts but fails the run if any requested URL fails.
This prevents a partial batch from looking complete.
Inspect the log for the affected post ID and source error.

#### Why is a transcript imperfect?

Speech recognition quality depends on source audio.
Try supplying the correct language code, then review low-confidence or consequential passages against the video.

#### Can it transcribe private or login-only posts?

No.
The Actor uses public guest access only and does not accept account cookies or credentials.

### Responsible and legal use

Use the Actor only for public content you are permitted to process.
Follow applicable laws, platform terms, copyright rules, privacy obligations, and your organization's retention policies.
Do not use transcript output to harass people, infer sensitive traits, bypass access controls, or republish protected material without permission.

Speech recognition is probabilistic.
Keep the source URL and timestamps, review important quotations, and distinguish machine transcripts from author-provided text.

### Related automation-lab Actors

- [`automation-lab/instagram-reel-video-transcripts`](https://apify.com/automation-lab/instagram-reel-video-transcripts) for public Instagram Reel and video transcripts.
- [`automation-lab/facebook-video-transcript-extractor`](https://apify.com/automation-lab/facebook-video-transcript-extractor) for public Facebook video and Reel transcripts.
- [`automation-lab/video-to-text-transcriber`](https://apify.com/automation-lab/video-to-text-transcriber) for uploaded files and anonymously reachable direct media URLs.

Choose this Actor when the source is a public X/Twitter status URL and X-specific post provenance matters.

### FAQ

#### Does the Actor download permanent video files?

No.
It temporarily downloads a low-bandwidth audio stream for transcription, removes working files after each URL, and returns metadata plus transcript records.

#### Can I process several videos in one run?

Yes, supply up to five public post URLs and set `maxItems` accordingly.

#### Does it translate transcripts?

No.
It detects or accepts the spoken language and transcribes in that language.
Use a downstream translation step when needed.

#### Does it use X API credentials?

No.
It uses the public web guest flow and does not require an X developer account or user login.

#### Are engagement counts historical?

No.
They are a best-effort snapshot exposed when the post is resolved.
Use scheduled runs and external comparison logic if you need change tracking.

#### Is every successful run charged per URL?

The one-time start event applies once per run.
The transcript event applies only to each non-empty transcript successfully produced.

# Actor input Schema

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

Public x.com or twitter.com post URLs that contain spoken video.

## `maxItems` (type: `integer`):

Maximum number of unique post URLs to process in this run.

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

Use auto to detect the language, or enter a two/three-letter language code such as en, es, fr, ja, or deu.

## `maxVideoDurationSeconds` (type: `integer`):

Reject videos longer than this many seconds before transcription to control runtime and cost.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://x.com/NASA/status/2087601629486813499"
    }
  ],
  "maxItems": 3,
  "language": "auto",
  "maxVideoDurationSeconds": 600
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset containing transcript text, segments, source identity, and media metadata.

# 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://x.com/NASA/status/2087601629486813499"
        }
    ],
    "maxItems": 3,
    "language": "auto",
    "maxVideoDurationSeconds": 600
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/x-twitter-video-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 = {
    "startUrls": [{ "url": "https://x.com/NASA/status/2087601629486813499" }],
    "maxItems": 3,
    "language": "auto",
    "maxVideoDurationSeconds": 600,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/x-twitter-video-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 '{
  "startUrls": [
    {
      "url": "https://x.com/NASA/status/2087601629486813499"
    }
  ],
  "maxItems": 3,
  "language": "auto",
  "maxVideoDurationSeconds": 600
}' |
apify call automation-lab/x-twitter-video-transcript-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/x-twitter-video-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/EXkme1WxGDRNTADwT/builds/quKY8gOf3mDvr5tJj/openapi.json
