How to Turn X Video Posts into Searchable Transcripts
An account's timeline can mix its own videos with reposts and quotes. If you are studying what that account says, you need both the actual author and the spoken content, not just the timeline where a clip appeared.
The X (Twitter) Video Transcript Scraper returns post metadata and AI transcripts with timestamped paragraphs. I maintain it. This guide collects up to five short NASA videos and turns their transcripts into a source-linked research index.

Keep discovery and audio scope small
The Actor runs on Apify without X credentials or cookies. profiles accepts handles or profile URLs; postUrls accepts x.com or twitter.com status links or bare post IDs.
Profile discovery reaches roughly seventeen of an account's own recent posts, plus reposts on its timeline. That is a post-discovery window, not a guarantee of seventeen videos. includeOlderPosts may find a few more, but it is not a full-history backfill.
Open Input in JSON view:
{
"profiles": ["nasa"],
"onlyVideoPosts": true,
"onlyOwnPosts": true,
"maxVideoMinutes": 5,
"includeOlderPosts": false,
"language": "auto",
"maxResults": 5
}
onlyOwnPosts excludes reposts and quotes of other accounts. onlyVideoPosts skips text-only and image-only posts. maxResults caps the entire run, while maxVideoMinutes is a per-video transcription guard. A longer clip can still return post metadata without a transcript; the setting does not truncate every video to five minutes or cap total audio for the run.
Click Start, then inspect authorHandle, discoveredVia, durationSeconds, and any transcriptNote in the dataset.
Understand the transcript record
A shortened historical README sample contains:
{
"tweetId": "2087601629486813499",
"postUrl": "https://x.com/NASA/status/2087601629486813499",
"discoveredVia": "@nasa",
"authorHandle": "NASA",
"durationSeconds": 228,
"transcriptLanguage": "en",
"transcriptConfidence": 0.999,
"transcriptParagraphs": [
{
"text": "Talking to us live from Iceland...",
"start": 0.08,
"end": 6.32,
"speaker": 0
}
]
}
authorHandle identifies the actual poster, while discoveredVia records how the Actor found it. Preserve both if you later allow reposts. The paragraph's speaker number is a segment label, not the verified identity of a named person.

Historical X output illustrates the author and transcript fields retained in the research index.
Make a searchable paragraph index
Export JSON so transcriptParagraphs remains an array. Keep a parent post table keyed by tweetId, with postUrl, postedAt, author fields, text, transcript language, and duration. Add a run timestamp for your archive when the record does not include one.
Expand the paragraph array into rows containing the post ID, paragraph index, start, end, speaker, and text. Search this paragraph text for a research term, then open postUrl and seek to the matching start time. Keep neighboring paragraphs when reviewing a claim so the search result does not strip away qualifications.
Search the post's text separately from the transcript. A caption can mention a topic that nobody says aloud. Mark which field matched, and retain the source URL in any notes or summary you produce.
Use transcriptConfidence as a review signal, not a guarantee that names, numbers, or quotations are correct. Verify important wording against the audio. Automatic speaker labels and an account name do not establish who is speaking in a clip.
Calculate the audio bill explicitly
Pricing as of September 6, 2026: $0.01 per returned post, $0.02 per transcribed video, and $0.025 per started audio minute. Actor start adds $0.00005 per GB of allocated memory, minimum one event.
For the historical 228-second clip, four started minutes would cost $0.10 in minute events. Adding its post and transcript events gives $0.13 before the run's start charge. Five separate one-minute transcribed videos would cost $0.275; five separate five-minute videos would cost $0.775. These are illustrative event calculations, not a report of a new run. Check live pricing.
The Actor documents within-run handling of repeated videos to avoid duplicate transcription charges. That does not mean your next scheduled run remembers the earlier dataset. Maintain an archive keyed by post ID and keep your own processed-link list when deciding what to submit again.
Handle skipped transcripts and sparse timelines
A small result can be expected when an account posts few original videos. Before broadening the scope, decide whether reposts are relevant to the research question. For a known older clip, use postUrls instead of relying on profile discovery.
If transcript text is missing, read transcriptNote and check the duration guard. No speech and an over-length video require different decisions. You can submit a deliberately chosen long clip with a higher per-video limit after reviewing its duration and cost.
The LinkedIn transcript guide covers a related source; preserve platform and author fields when combining the resulting notes.
The Node.js example shows how to run this Actor from code and retrieve its dataset.
Frequently asked questions
Does maxVideoMinutes cap the audio minutes for the entire run?
No. It is a per-video guard. Longer videos return metadata without transcription; several eligible videos can each contribute their own billable audio minutes.
Can profile discovery retrieve an account’s full history?
No. Roughly seventeen own recent posts are reachable, plus timeline reposts. includeOlderPosts may find a few more; use known postUrls for specific older clips.
Is discoveredVia the author of a post?
Not necessarily. discoveredVia identifies the timeline used for discovery. Use authorHandle, authorName, and authorUrl for the actual poster.
