# Twitter Transcript Scraper (`automly/x-twitter-video-transcript-scraper`) Actor

Get the transcript of X (Twitter) videos from post links or whole profiles: everything said in each video as text and timed segments, with the spoken language, plus the post's text, author, views and likes. Videos without speech are free. No login.

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

## Pricing

from $2.50 / 1,000 transcripts

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?

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

## Twitter Transcript Scraper

### What is Twitter Transcript Scraper?

**Twitter Transcript Scraper** turns **X (Twitter) videos into text**. Paste post links or usernames, click **Start**, and get one row per video with **everything that is said in it**: the full transcript, the transcript in timed parts and the spoken language, next to the post's text, author, length, views, likes, reposts and replies. Download it as Excel, CSV or JSON, or schedule it to transcribe an account's new videos every day.

- 🗣️ **Full transcripts:** every word spoken in the video, as one text and in timed parts
- 🌍 **Any language:** the spoken language is detected for each video, and the transcript is in that language
- 👤 **Whole accounts or single posts:** the newest videos of any public account, or any video by its post link
- 🔁 **Reposts and quotes handled:** a repost gives the original video, a post that quotes a video gives the quoted video
- 🎵 **No-speech videos are free:** music-only clips, GIFs and posts without a video are saved and marked, and you are not charged for them
- 🔓 **No login:** no X account, cookies or API key needed

### What can Twitter Transcript Scraper do?

- Transcribe the **newest videos of many accounts** in one run, up to the number you choose per account
- Transcribe **single videos** from their post links (x.com or twitter.com), or from bare post IDs
- Find out **what people say on camera**, not just what they write in the post
- Get **timed transcripts** to find the moment something is said, quote it or cut a clip
- Export to Excel, CSV, JSON, HTML or XML, or send the results to Google Sheets, Make, Zapier and more

### What data can you get from X videos?

| | | |
|---|---|---|
| 🗣️ Transcript | ⏱️ Timed transcript parts | 🌍 Spoken language |
| 🔗 Post link and ID | ✍️ Post text and language | 📅 Posting date |
| ⏱️ Video length in seconds | 👁️ Views, ❤️ likes, 🔁 reposts, 💬 replies, 🔖 bookmarks | 👤 Author username, name, followers, checkmark |
| 📹 Video file link | 🖼️ Thumbnail | 🎞️ Video or GIF |

### How to get the transcript of a Twitter video

1. [Create a free Apify account](https://console.apify.com/sign-up) (no credit card needed).
2. Open **Twitter Transcript Scraper**.
3. Paste one or more **post links**, or add **usernames** to transcribe their newest videos.
4. Choose how many **videos per profile** you want transcribed.
5. Click **Start**, then download the results as Excel, CSV, JSON, HTML or XML.

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

You pay per video with speech, whether its transcript comes from the video's own captions or from its sound. The transcript price includes the first minute of each video; a longer video also pays an **extra minute** for every started minute past the first. Higher Apify plans pay less:

| Apify plan | Per 1,000 transcripts | Per 1,000 extra minutes |
|---|---|---|
| Free | $3.50 | $2.50 |
| Starter (Bronze) | $3.00 | $2.20 |
| Scale (Silver) | $2.80 | $2.00 |
| Business (Gold) and higher | $2.50 | $1.80 |

So a 5-minute video is 1 transcript and 4 extra minutes. Platform usage is included in these prices, so you pay nothing else for the run. There is no start fee.

Example: 1,000 one-minute videos cost $3.00 on Starter, $2.80 on Scale and $2.50 on Business and higher.

Never charged:

- videos with no speech (music only, sounds or silence), GIFs and posts without a video,
- videos longer than your **Longest video (minutes)**,
- links that do not exist and videos whose sound could not be downloaded or transcribed,
- extra minutes of any video that a Free plan run cut to its first minute, and videos the run reached after its free minute was used.

Every Apify account gets **$5 of free usage each month**.

**On the Apify Free plan**, transcripts made from the audio use a lighter, slower method, so expect lower accuracy (more wrong words, most of all in songs and noisy videos), and a run transcribes up to 1 minute of audio: a longer video gets its first minute, and videos past that minute are saved as not transcribed and are not charged. Keep the default 1 GB memory: with less, a Free plan run transcribes no audio. Transcripts from a video's own captions are the same on every plan. Paid Apify plans get full-accuracy transcripts with no such limit.

### ⬇️ Input

| Setting | What it does |
|---|---|
| Post links | Posts with a video, one per line: `https://x.com/NASA/status/2115845108176441635`, a `twitter.com` link, a link ending in `/video/1`, or a bare post ID |
| Profiles | Usernames or profile links (`NASA`, `@NASA`, `https://x.com/NASA`): each gives its newest videos |
| Videos per profile | The most videos to transcribe from each profile, newest first (default 10) |
| Longest video (minutes) | Longer videos are saved with their post details but not transcribed, and cost nothing (default 60) |
| Spoken language (optional) | A code such as `en`, `es` or `fr` when every video is in that language. Leave empty to detect each video's language |

Example:

```json
{
  "postUrls": ["https://x.com/NASA/status/2115845108176441635"],
  "profiles": ["SpaceX"],
  "videosPerProfile": 10
}
```

A single link in `videoUrl` works too, as in other X transcript tools.

### ⬆️ Output

You get one row per video. View them as a table in Apify Console or download them as Excel, CSV, JSON, HTML or XML.

```json
{
  "id": "2115845108176441635",
  "url": "https://x.com/NASA/status/2115845108176441635",
  "authorUsername": "NASA",
  "authorName": "NASA",
  "text": "@csa_asc @Space_Station Solar array, roll out! At about four-and-a-half hours into today’s spacewalk, the solar array began deployment. It is now fully deployed.",
  "createdAt": "2026-10-29T16:35:58Z",
  "durationSeconds": 22.1,
  "transcriptStatus": "transcribed",
  "transcriptSource": "speech",
  "transcriptLanguage": "en",
  "transcript": "Four hours and 23 minutes into today's spacewalk, the seventh episode. ISS rollout solar array begins to roll out. and will for the next 10 minutes or so to a fully deployed length of 60 feet",
  "transcriptSegments": [
    {"start": 3.54, "end": 9.26, "text": "Four hours and 23 minutes into today's spacewalk, the seventh episode."},
    {"start": 10.32, "end": 14.8, "text": "ISS rollout solar array begins to roll out."},
    {"start": 14.91, "end": 22.11, "text": "and will for the next 10 minutes or so to a fully deployed length of 60 feet"}
  ],
  "videoId": "2115844986121973760",
  "videoType": "video",
  "videoUrl": "https://video.twimg.com/amplify_video/2115844986121973760/vid/avc1/3840x2160/bFtWNhBlnRTuKsG-.mp4?tag=29",
  "thumbnailUrl": "https://pbs.twimg.com/amplify_video_thumb/2115844986121973760/img/UVq5lw5EUQLmo5YD.jpg",
  "lang": "en",
  "authorId": "11348282",
  "authorVerified": true,
  "authorFollowers": 92296242,
  "views": 159119,
  "likes": 316,
  "retweets": 25,
  "replies": 14,
  "quotes": 5,
  "bookmarks": 9,
  "fromQuotedPost": false,
  "source": "https://x.com/NASA/status/2115845108176441635",
  "scrapedAt": "2026-11-01T13:09:47Z"
}
```

`transcriptStatus` tells you what happened with each video:

| Status | Meaning | Charged |
|---|---|---|
| `transcribed` | Speech was found; `transcript` has it | Yes |
| `no_speech` | Music, sounds or silence only; `transcript` is empty | No |
| `gif` | A GIF, which has no sound | No |
| `too_long` | Longer than **Longest video (minutes)** | No |
| `no_video` | The post link has no video | No |
| `audio_unavailable` | The video's sound could not be read this time; run it again later | No |

`transcriptSource` says where the words came from: `captions` when the video has its own captions in its spoken language, `speech` when they were taken from what is said. Each run also saves a short report: how many videos had speech, how many videos each profile has, and any link that does not exist.

### How can I use Twitter video transcripts?

- **Media monitoring:** get the exact words of news clips, press conferences, speeches and interviews posted on X
- **Brand and competitor research:** track what founders, brands and politicians say on camera
- **Content repurposing:** turn video posts into threads, articles, newsletters and show notes
- **Research and fact-checking:** quote what was actually said, with the second it was said
- **Search and analysis:** load transcripts into spreadsheets, databases or search tools, or summarize them in your own workflow

### Use it from your code

Run the actor from your own code with the [Apify API](https://docs.apify.com/api/v2) or the Python and JavaScript clients:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("automly/x-twitter-video-transcript-scraper").call(run_input={
    "profiles": ["NASA"],
    "videosPerProfile": 10,
})
for video in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(video["url"], video["transcriptLanguage"], video["transcript"])
```

### Use with assistants and agents (MCP)

Connect any MCP-compatible assistant or agent to the Apify MCP server at https://mcp.apify.com (sign in with your Apify account), and it can find this actor, fill in the input and read the results by itself. Ask in plain words, for example *"Get the transcripts of NASA's last 10 videos on X"*, and the agent runs `automly/x-twitter-video-transcript-scraper` with an input like `{"profiles": ["NASA"], "videosPerProfile": 10}`. Agent runs cost the same as runs you start yourself.

### ❓FAQ

#### How accurate are the transcripts?

Clear speech comes out close to word for word. Transcripts made from the spoken words have punctuation; a video's own captions keep the punctuation they have, which is sometimes none. Accuracy drops with loud background music, several people talking at once and heavy accents. Words sung in a song are transcribed like speech.

#### Which languages are supported?

The spoken language is detected for each video, and the transcript is in that language (it is not translated). English, Spanish, French, German, Portuguese, Arabic, Hindi, Japanese, Korean, Chinese and many other languages work. If all your videos are in one language, set **Spoken language** to its code (for example `es`).

#### Is the transcript the same as the post text?

No. The post text is what the author wrote. The transcript is what is said in the video. You get both.

#### How many videos can I get from one account?

X shows visitors about the latest 650-850 posts of an account, so you get the videos among them, newest first, up to **Videos per profile**. For some big accounts X shows visitors only their few newest posts and their most-liked posts (about 100); you then get the videos among the newest ones first, then among the most-liked ones, and the run report says so. Reposts of other accounts' videos are skipped; add their post links to transcribe them. The run report says how many videos each profile had when there were fewer than you asked for.

#### Does it work with long videos?

Yes. Interviews, podcasts and streams of an hour or more work. **Longest video (minutes)** is 60 by default, so you never pay for a three-hour video by accident; raise it when you want long videos transcribed.

#### What happens with music-only videos and GIFs?

Videos with only music, sound effects or silence are saved with `transcriptStatus` set to `no_speech` and an empty transcript. GIFs have no sound and are saved as `gif`. You are not charged for either.

#### What happens with a post that quotes a video?

If the post has no video of its own and quotes a post with a video, the quoted video is transcribed and `fromQuotedPost` is `true`. A repost gives the original post's video. The same video is transcribed and charged once per run, even when it is in several posts.

#### What happens with a link that does not exist?

It is skipped and listed in the run's report as not found. The run still finishes successfully and you are not charged for it. Spaces and live broadcasts are not supported.

#### Do I need an X account?

No. You don't need an X account, cookies or an API key. Only public posts are read: posts of protected accounts are not available.

#### Can I connect Twitter Transcript Scraper to other tools?

Yes. Start runs and download results with the Apify API or the Python and JavaScript clients, send results to Make, Zapier, n8n, Google Sheets or Slack with Apify integrations and webhooks, or let agents run it through the Apify MCP server at [mcp.apify.com](https://mcp.apify.com).

#### Is it legal to transcribe Twitter videos?

This tool only processes videos that people chose to show publicly. It does not collect private data such as email addresses or phone numbers. Videos and their transcripts can still contain personal data, which may be protected by laws such as GDPR, and videos are protected by copyright, so use the transcripts for a legitimate reason such as research, and ask a lawyer if you are unsure. You can read more in [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

Twitter Transcript Scraper is an independent tool. It is not affiliated with, endorsed by or sponsored by X Corp.

#### Something isn't working. What should I do?

Open the **Issues** tab and tell us the link and what you expected. We usually reply within a day. If the tool helped you, a review on its Store page helps other people find it.

### Scrape more X (Twitter) data

| Actor | What you get |
|---|---|
| [Twitter Scraper](https://apify.com/automly/x-twitter-profile-tweets-scraper) | An account's posts with text, views, likes, reposts, replies and media, plus its profile |
| [Tweet Scraper](https://apify.com/automly/x-twitter-tweet-scraper) | Any posts by link or ID, with their counts, media, links and quoted post |
| [Twitter Profile Scraper](https://apify.com/automly/x-twitter-user-profile-scraper) | Profiles: followers, following, post count, bio, location, website, join date |

# Actor input Schema

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

X (Twitter) post links with a video, one per line, e.g. https://x.com/NASA/status/2115845108176441635. twitter.com links, links ending in /video/1 and bare post IDs work too. A repost gives the original video; a post that quotes a video gives the quoted video.

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

X usernames or profile links, e.g. NASA, @NASA or https://x.com/NASA. Each profile gives the transcripts of its newest videos (the account's own posts, newest first).

## `videosPerProfile` (type: `integer`):

How many of each profile's newest videos to transcribe, e.g. 10. X shows visitors about the latest 650-850 posts of an account, so very old videos may be out of reach. Not used for post links.

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

Videos longer than this are saved with their post details but not transcribed, and cost nothing, e.g. 60. Raise it for long interviews and podcasts.

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

A language code when all the videos are in that language, e.g. en, es, fr, ar or ja. Leave empty to detect the language of each video.

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

Leave the default.

## Actor input object example

```json
{
  "postUrls": [
    "https://x.com/NASA/status/2115845108176441635"
  ],
  "videosPerProfile": 10,
  "maxVideoMinutes": 60,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `details` (type: `string`):

No description

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

No description

## `report` (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 = {
    "postUrls": [
        "https://x.com/NASA/status/2115845108176441635"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automly/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 = {
    "postUrls": ["https://x.com/NASA/status/2115845108176441635"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("automly/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 '{
  "postUrls": [
    "https://x.com/NASA/status/2115845108176441635"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call automly/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,automly/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/b3G40BOwt5X1eVTH9/builds/oGkl0iCpTur0Rs2kG/openapi.json
