How to Export Facebook Video and Reel Transcripts
If you are researching how a Page talks about a product, a folder of video links is hard to search. A useful index needs spoken text, the clip it came from, and the moment in the clip where the words appear.
The Facebook Video Transcript Scraper returns video metadata, available platform captions, and timestamped cues, with optional AI transcription for videos without captions. I maintain it. This guide turns a small sample of Vogue Reels into searchable notes.

Choose recent discovery or known video links
The Actor runs on Apify without a Facebook login or cookies. pages accepts Page names or URLs and discovers roughly ten recent Reels per Page. It does not backfill an entire Page history. Use videoUrls for specific reel, watch, or video URLs when you already know the clips you need.
Start with platform captions so you can inspect coverage before paying for AI audio processing. In Input, choose JSON and enter:
{
"pages": ["vogue"],
"onlyPostsNewerThan": "30 days",
"transcribeWithAI": false,
"language": "auto",
"maxResults": 5
}
onlyPostsNewerThan filters by publication date and accepts a date or a phrase such as 30 days. It cannot expand Page discovery beyond the recent Reels the source exposes. maxResults caps videos across the run, so adding Pages does not give each Page five rows.
language controls the spoken-language hint for AI transcription. It does not force every available platform caption track into that language. Click Start, then inspect hasTranscript, transcriptLanguage, transcriptSource, and skippedReason in the dataset.
A caption can differ from the post description
This shortened historical README example shows why both are useful:
{
"id": "2478199499323298",
"description": "Margaret Qualley brought Chanel's barefoot sandals to the red carpet.",
"hasTranscript": true,
"transcriptSource": "platform",
"transcriptLanguage": "en_US",
"transcriptIsTranslation": false,
"transcriptCues": [
{
"start": 0,
"end": 3.761,
"text": "Just your right please. And again eyes straight up. Thank"
}
]
}
The post description names the subject and brand; the spoken cue contains photographers' directions. A search for “Chanel” in spoken text alone would miss this brand-related post. Keep description and transcript as separate searchable fields so a result can say whether the match came from the captioned speech or the author's post text.

Earlier Facebook output shows transcript availability alongside the video metadata.
Make one row per searchable cue
Export JSON to preserve transcriptCues. A flat CSV export is useful for video metadata, but nested cues need their own table for reliable clip-level search.
Create a video table keyed by id, retaining url, ownerName, createdAt, description, transcript, transcriptSource, transcriptLanguage, transcriptIsTranslation, and scrapedAt. Then expand each element of transcriptCues into a second table with video ID, source URL, cue start, cue end, and cue text.
Use video ID plus the cue's array position as a row key. In a spreadsheet, filter the cue-text column for a research term. In a search application, index that column while retaining the ID and timestamps as metadata. For a match at 42 seconds, open the source video and seek to 0:42; keep the surrounding cues so a clipped sentence does not lose its meaning.
Mark matches from description separately as “post text.” A video with no usable transcript can still be relevant by its description, but it cannot supply a timestamped spoken quotation.
Before quoting, check transcriptIsTranslation. A translated track may help discovery, but it is not the original wording. Review the audio for names, numbers, and other passages that matter; neither platform captions nor AI text guarantee transcription accuracy.
Fill the gaps deliberately
If hasTranscript is false, read skippedReason. Some clips have no speech; others lack platform captions. To retry selected gaps, place their URLs in videoUrls, remove the Page discovery input, and enable transcribeWithAI. That keeps the retry focused on known clips rather than another changing discovery sample.
Pricing as of September 6, 2026: $0.003 per returned video, plus $0.005 when text is returned. AI transcription adds $0.02 per started audio minute when used. Actor start costs $0.00005 per GB of allocated memory, minimum one event.
Five videos with platform transcripts therefore cost $0.04 in video and transcript fees, plus the start charge. For one 61-second video requiring AI, two started minutes add $0.04, making its combined video, transcript, and AI events $0.048. Check live pricing before enabling AI for a larger set.
Keep an archive without duplicate clips
Save the discovery input as an Apify task, then upsert videos by id in your archive. A rolling 30-day date filter overlaps yesterday's window; it does not remember which IDs you already collected. Replace or version a video's cues when you refresh its transcript instead of appending duplicates.
Keep translated and original-language text distinguishable, and retain source links when sharing research notes. If your research also covers X, the X transcript guide uses timestamped paragraphs and different billing rules.
The Node.js example shows how to run this Actor from code and retrieve its dataset.
Frequently asked questions
Which fields support clip-level search?
Expand transcriptCues into rows containing the video id, url, cue start, cue end, and cue text. Keep transcriptSource, transcriptLanguage, and transcriptIsTranslation with the parent video.
Will a relative-date filter prevent duplicate scheduled results?
No. Rolling date windows overlap. Deduplicate or upsert by video id, and replace or version the associated cues when a transcript changes.
Does language select the language of every platform caption?
No. language is the spoken-language setting for AI transcription. Check transcriptLanguage and transcriptIsTranslation to understand the platform text actually returned.
