# X (Twitter) Video Transcript Scraper (`piotrv1001/x-twitter-video-transcript-scraper`) Actor

The X (Twitter) Video Transcript Scraper turns posted videos into searchable text, capturing full AI transcripts with timestamps and detected language, plus author, handle, post text, publish date, likes, replies and view count — ideal for content research, competitor analysis and AI pipelines.

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

## Pricing

from $5.00 / 1,000 posts

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/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

### 🐦 X (Twitter) Video Transcript Scraper

Turn **[X](https://x.com) (Twitter) videos into searchable text**. Point the **X (Twitter) Video Transcript Scraper** at an account or at specific posts, and get an **AI transcript of every video** alongside the full post data — author, post copy, likes and replies.

X shows no captions and offers no transcript download, so video is the one part of the platform that stays invisible to search, analysis, and AI pipelines. This Actor fixes that.

Run it on the [Apify platform](https://apify.com) to get **API access, scheduling, integrations (Google Sheets, Make, Zapier, and more), automatic retries, and monitoring** out of the box — no code required.

### ✨ Features

- 🎙️ **AI Transcription**: Every video turned into clean, punctuated text with automatic language detection across 20+ languages.
- ⏱️ **Timestamped Paragraphs**: Transcripts come segmented with start and end times, ready for clipping, subtitling, or jumping to a quote.
- 👤 **Full Post Context**: Author name and handle, post text, publish date, likes and replies on every record.
- 🔁 **Correct Attribution**: Reposts and quotes are credited to whoever actually posted them, not to the timeline they were found on.
- 🔗 **Direct Post URLs**: Paste specific post links when you already know what you want transcribed.
- ⏳ **Length Guard**: Set a maximum video length so a single hour-long clip can't blow up a run's cost.
- 🎯 **Video-First**: By default only posts containing video are returned, so you never pay for empty rows.
- 💸 **Never Billed Twice**: The same video reposted across several accounts is transcribed once and charged once.

### 🛠️ How to Use the X (Twitter) Video Transcript Scraper

1. **Add an account** – Type a handle such as `nasa`, or paste a profile URL. Or drop in specific post URLs.
2. **Set your options** – Choose how many posts to return, a maximum video length, and the spoken language (or leave it automatic).
3. **Run the scraper** – Click **Start**. Newest posts are processed first.
4. **Export your data** – Download the dataset as JSON, CSV, Excel, or HTML, or pull it via the Apify API.

### 🔧 Input

| Field               | Type    | Description                                                                                  |
| ------------------- | ------- | -------------------------------------------------------------------------------------------- |
| `profiles`          | Array   | Accounts to collect from — a handle like `nasa`, or a full profile URL.                      |
| `postUrls`          | Array   | Specific post URLs. Accepts x.com or twitter.com status links, or a bare post ID.            |
| `onlyVideoPosts`    | Boolean | Skip posts with no video. On by default.                                                     |
| `onlyOwnPosts`      | Boolean | Skip reposts and quotes of other accounts. Off by default.                                   |
| `maxVideoMinutes`   | Integer | Videos longer than this are returned without a transcript, and not charged for (default 20). |
| `includeOlderPosts` | Boolean | Also look beyond the account's recent posts for earlier ones.                                |
| `language`          | Select  | Spoken language of the audio, or `auto` to detect it.                                        |
| `maxResults`        | Integer | Maximum number of posts to return (default 20).                                              |

### 📊 Sample Output Data

```json
[
    {
        "tweetId": "2087601629486813499",
        "postUrl": "https://x.com/NASA/status/2087601629486813499",
        "postedAt": "2026-08-14T17:02:11.000Z",
        "discoveredVia": "@nasa",
        "authorName": "NASA",
        "authorHandle": "NASA",
        "authorUrl": "https://x.com/NASA",
        "authorVerified": true,
        "text": "The Nationwide Eclipse Ballooning Project, supported by NASA, gathers student teams...",
        "lang": "en",
        "likeCount": 1284,
        "replyCount": 37,
        "hasVideo": true,
        "videoUrl": "https://video.twimg.com/amplify_video/.../vid/avc1/480x270/....mp4",
        "videoQuality": "480x270",
        "thumbnailUrl": "https://pbs.twimg.com/media/....jpg",
        "durationSeconds": 228,
        "transcript": "Talking to us live from Iceland, we have Jarrod and Tessa who are part of the nationwide eclipse ballooning project...",
        "transcriptLanguage": "en",
        "transcriptConfidence": 0.999,
        "transcriptParagraphs": [
            { "text": "Talking to us live from Iceland...", "start": 0.08, "end": 6.32, "speaker": 0 }
        ]
    }
]
```

You can download the dataset in various formats such as **JSON, HTML, CSV, or Excel**.

### 📋 Data Fields

| Field                                        | Description                                                      |
| -------------------------------------------- | ---------------------------------------------------------------- |
| `tweetId` / `postUrl`                        | Post identifier and direct link.                                 |
| `postedAt`                                   | When the post was published.                                     |
| `discoveredVia`                              | Which account's timeline the post was found on.                  |
| `authorName`, `authorHandle`, `authorUrl`    | Who actually posted it — not necessarily the timeline it was on. |
| `authorVerified`                             | Whether the author's account carries a verified badge.           |
| `text`, `lang`                               | The post's body copy and its language.                           |
| `likeCount`, `replyCount`                    | Engagement on the post.                                          |
| `hasVideo`, `videoUrl`, `videoQuality`       | Whether the post carries video, and its direct media link.       |
| `thumbnailUrl`, `durationSeconds`            | Video cover image and length in seconds.                         |
| `transcript`                                 | The full spoken text of the video.                               |
| `transcriptLanguage`, `transcriptConfidence` | Detected language and the model's confidence score.              |
| `transcriptParagraphs`                       | Timestamped segments with `text`, `start`, `end`, and `speaker`. |
| `transcriptNote`                             | Present when a transcript was skipped, and why.                  |

### 💵 Pricing

This Actor uses the **pay-per-event** pricing model — you only pay for what you get:

| Event                       | Price    | When it's charged                         |
| --------------------------- | -------- | ----------------------------------------- |
| Actor start                 | $0.00005 | Once per run.                             |
| Post scraped                | $0.005   | Per post returned, with all its metadata. |
| Video transcribed           | $0.008   | Once per video turned into text.          |
| Minute of video transcribed | $0.008   | Per started minute of audio.              |

Most posted videos run under a minute, so a typical transcribed post costs about **$0.021** — roughly **$2.10 for 100 videos**. Longer videos cost proportionally more, which is why the **Max video length** option exists. Posts without video are skipped by default, videos containing no speech are not charged for, and a video that appears in several posts is charged once. New Apify accounts include **free monthly usage credits**, so you can try it at no cost.

### 💡 Tips

- Start with a small `maxResults` to preview the data shape before scaling up.
- Feed the transcripts into an LLM to summarise a competitor's messaging or pull talking points at scale.
- Lower **Max video length** when tracking accounts that post conference talks — it caps the cost per run.
- Schedule a run against the accounts you follow to build a searchable archive of their video content.
- Leave **language** on automatic unless detection is getting a specific accent or dialect wrong.

### ⚠️ Good to Know

- Roughly **17 of an account's own recent posts** are reachable, plus the reposts on its timeline. This Actor is built to monitor accounts over time, not to backfill an entire posting history in one run.
- Accounts vary enormously: some post almost entirely their own content, others almost entirely reposts. Turn on **Only the account's own posts** if you need strictly the former.

### ❓ FAQ

**Do I need an account or cookies?**
No. The Actor only reads publicly visible posts — no login, no cookies, nothing to configure.

**Is scraping X legal?**
This Actor collects only publicly available post data. You are responsible for using the data in compliance with X's Terms of Service and applicable laws.

**What about personal data?**
Records include the post author's public name, handle and profile URL, all already public. If you're processing this data for EU residents, you're the controller and GDPR applies to what you do with it.

**What if a post has no video?**
By default those posts are skipped and not charged. Turn off **Only posts with video** to have them returned as regular post records without a transcript.

**How accurate are the transcripts?**
Each record includes a `transcriptConfidence` score so you can filter on quality. Clear speech typically scores above 0.95; heavy background music or crosstalk scores lower.

### 🆘 Support

Found a bug or need a custom data field? Open an issue from the Actor's **Issues** tab and we'll take a look. Custom scraping solutions are also available on request.

Make X's video content searchable with the **X (Twitter) Video Transcript Scraper** today! 🚀

# Actor input Schema

## `profiles` (type: `array`):

X (Twitter) accounts — a handle like `nasa`, or a full profile URL. Their recent posts are collected and every video among them is transcribed.

## `postUrls` (type: `array`):

Specific post URLs to transcribe. Accepts x.com or twitter.com status links, or a bare post ID.

## `onlyVideoPosts` (type: `boolean`):

Skip posts that have no video. Turn this off to also get text and image posts, which are returned without a transcript.

## `onlyOwnPosts` (type: `boolean`):

Skip reposts and quotes of other accounts. Off by default, because many accounts mostly repost — leaving it off returns more, and every record is still attributed to whoever actually posted it.

## `maxVideoMinutes` (type: `integer`):

Videos longer than this are returned with their post data but no transcript, and are not charged for transcription. Posts here can run close to an hour, so this keeps a run's cost predictable.

## `includeOlderPosts` (type: `boolean`):

Also look beyond the account's recent posts for earlier ones. Adds time to the run and typically finds only a handful.

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

Language of the audio. Leave on automatic unless detection is getting it wrong.

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

Hard cap on the number of posts returned across the whole run. Newest posts are returned first.

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

Optional proxy settings.

## Actor input object example

```json
{
  "profiles": [
    "nasa"
  ],
  "postUrls": [],
  "onlyVideoPosts": true,
  "onlyOwnPosts": false,
  "maxVideoMinutes": 20,
  "includeOlderPosts": false,
  "language": "auto",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (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 = {
    "profiles": [
        "nasa"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/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 = { "profiles": ["nasa"] }

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/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 '{
  "profiles": [
    "nasa"
  ]
}' |
apify call piotrv1001/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,piotrv1001/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/xgDBNB8SCP0zgMsfe/builds/MceeqW8EsUpq0HBC9/openapi.json
