Facebook Videos Scraper & Spoken Text Transcript avatar

Facebook Videos Scraper & Spoken Text Transcript

Pricing

Pay per usage

Go to Apify Store
Facebook Videos Scraper & Spoken Text Transcript

Facebook Videos Scraper & Spoken Text Transcript

Scrape Facebook videos with the Facebook Videos Scraper. Extract video URLs, titles, descriptions, upload dates, views, reactions, and comments. Ideal for content analysis, trend tracking, and social media research. Fast, reliable, and scalable for single or bulk videos.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Scrapier

Scrapier

Maintained by Community

Actor stats

0

Bookmarked

8

Total users

1

Monthly active users

3 days ago

Last modified

Share

Facebook Reel Transcript Scraper — Video Data & Hashtags

Facebook Reel Transcript Scraper pulls the full video record for public Facebook Reels and, where a caption track or speech-to-text run produces one, the spoken text as plain text, SRT, WebVTT, or timed-cue JSON. Every response is structured JSON — ready to pass directly to an LLM, index into a vector store, or feed a content-repurposing pipeline. Paste one Reel URL or a few hundred and get back the media formats, duration, description, hashtags, mentions, and a transcript that is explicitly labeled with the path that produced it — platform caption track or speech-to-text — so a machine transcript is never mistaken for a publisher caption. No Facebook login or session cookie is required.

What is Facebook Reel Transcript Scraper?

Facebook Reel Transcript Scraper takes a list of public Facebook Reel URLs and returns, for each one, the video's metadata and download formats plus its spoken-word transcript in the format you choose. It queries Facebook's own logged-out Reel pages — no account, cookie, or session ID is needed to run it. What sets it apart from a plain caption scraper is that it never silently swaps one transcript source for another: it tries the platform's own caption track first, optionally falls back to a speech-to-text call you configure with your own API key, and stamps every row with a transcriptSource and transcriptIsOfficialCaptionTrack field so you always know which one you got.

Key capabilities:

  • 🎬 Full video record — title, description, duration, upload timestamp, thumbnail, uploader ID, and every DASH/progressive media format Facebook exposes for the Reel
  • 🗣️ Two-path transcript extraction — the platform's own caption track, then an optional speech-to-text fallback using an OpenAI-compatible endpoint you supply
  • 📝 Four selectable transcript shapes — plain text, SRT, WebVTT, or a timed-cue JSON array
  • 🌐 Caption language targeting — request a specific locale and get an explicit "not available" status instead of a silently substituted language
  • #️⃣ Hashtags and @-mentions mined from the Reel's own description, not a sibling video's
  • 📋 A transcriptStatus on every row that states exactly what happened — caption found, no caption track, wrong language, speech-to-text disabled, speech-to-text failed, or transcript off

📊 What data can you get with Facebook Reel Transcript Scraper?

Each dataset row is one Reel, carrying three field groups: the video record, the transcript, and the text mined from the description.

Result TypeExtracted FieldsPrimary Use Case
Video recordtitle, description, duration, duration_string, timestamp, upload_date, thumbnail, thumbnails, uploader_id, webpage_url, id, display_idCataloguing and metadata enrichment
Media formatsformats[] (DASH audio/video representations and progressive sd/hd links), requested_formats, format, format_id, resolution, width, height, fps, vcodec, acodec, filesize_approxDownload pipelines, media archiving
Transcripttranscript, transcriptFormat, transcriptSource, transcriptSourceDetail, transcriptLanguage, transcriptIsOfficialCaptionTrack, transcriptCueCount, transcriptStatus, captionTracksAvailable[]Content repurposing, subtitle generation, search indexing
Text miningdescriptionHashtags[], descriptionMentions[]Trend and competitor mention tracking

Dual-path transcript with source labeling

This is the field group competitors in this space don't expose: every row states which extraction path produced its transcript, not just whether one exists. transcriptSource is platform_caption_track, speech_to_text, or null. transcriptIsOfficialCaptionTrack is true only when the text came from Facebook's own caption file — it is explicitly false for a speech-to-text result, so a machine transcript can never be mistaken for a publisher caption further down your pipeline. captionTracksAvailable also lists every caption locale Facebook published for the Reel, even the ones not selected, so you can see what languages exist before deciding to re-run with a different captionLanguage.

{
"transcript": "We're fishing bite x2 best bait on this pole thank you very much",
"transcriptFormat": "text",
"transcriptSource": "platform_caption_track",
"transcriptSourceDetail": "GENERATED_BY_FACEBOOK",
"transcriptLanguage": "en_US",
"transcriptIsOfficialCaptionTrack": true,
"transcriptCueCount": 5,
"transcriptStatus": "ok_caption_track",
"captionTracksAvailable": [
{ "locale": "en_US", "creationMethod": "GENERATED_BY_FACEBOOK" },
{ "locale": "es_LA", "creationMethod": "TRANSLATED" }
]
}

Hashtags and mentions anchored to the right video

A Facebook Reel page embeds around six videos in its server-rendered payload — the one you requested plus autoplay siblings queued after it — and every per-video key, including the description, repeats once per video. The Actor binds each value to the requested Reel by walking back to the nearest preceding video_id marker in the page source rather than taking the first match, so descriptionHashtags and descriptionMentions are mined from the correct Reel's caption text, not a sibling's. Both arrays are deduplicated case-insensitively and returned without the leading # or @.

Why not build this yourself?

Facebook does not publish a general-purpose, key-based API for reading an arbitrary public Reel's caption track, media formats, or description by URL — the Graph API's video endpoints are scoped to pages and assets you own or manage, not to any public Reel a user pastes in. Building this in-house means reverse-engineering Facebook's server-rendered page payload, which embeds several sibling videos per page and requires anchoring every field to the correct one (see the note above), parsing a DASH MPD manifest for video/audio representations, handling the SRT caption format Facebook actually serves, and re-doing that work every time Facebook changes its markup. You'd also need to build the block-detection and proxy-escalation logic to keep runs going past rate limiting, and a billing gate so you don't pay for pages that come back empty. Facebook Reel Transcript Scraper ships all of that as a maintained Actor instead of a script you have to keep patching.

What is the difference between caption extraction and speech-to-text transcription?

Caption extraction reads text Facebook (or the Reel's publisher) already generated and attached to the video as a subtitle file — it exists before you ever request it. Speech-to-text transcription computes new text from the audio track by sending it to a third-party model, after you request it. The distinction matters because the two have different accuracy characteristics, different cost (captions are free to read; speech-to-text is a paid API call you make with your own key), and different provenance — a caption track was authored or reviewed alongside the video, while a machine transcript was generated afterward and can contain the errors any speech model makes on background noise, accents, or music.

Facebook Reel Transcript Scraper returns both, from the same run, and never blends them silently. textExtraction: "auto" tries the caption track first (transcriptSource: "platform_caption_track", transcriptIsOfficialCaptionTrack: true) and only calls speech-to-text if you've enabled it and no caption track exists (transcriptSource: "speech_to_text", transcriptIsOfficialCaptionTrack: false). textExtraction: "captionsOnly" never makes an external call at all. The field to check is transcriptIsOfficialCaptionTrack — not the presence of transcript alone.

How to scrape Facebook Reels with Facebook Reel Transcript Scraper?

  1. Open Facebook Reel Transcript Scraper on the Apify Store and click Try for free.
  2. Paste one or more public Facebook Reel links into videoUrls — one per line, for example https://www.facebook.com/reel/1076980157988172.
  3. Set the query controls that matter for your use case: textExtraction for how spoken text is obtained, transcriptFormat for the shape you want back, and captionLanguage if you need a specific locale.
  4. Click Start and let the run finish — the Actor processes each URL in your list in turn and reports progress in the run's status message.
  5. Open the Dataset tab and export as JSON or CSV, or pull the results through the Apify API.
{
"videoUrls": [
"https://www.facebook.com/reel/1076980157988172",
"https://www.facebook.com/reel/958214722841903"
],
"textExtraction": "auto",
"transcriptFormat": "srt",
"captionLanguage": "en"
}

How to run multiple queries in one job

Add every Reel URL you want to videoUrls as a stringList — one per line — and they all run in the same job. Internally, the Actor works through the list sequentially, one Reel fetch (and, where applicable, one caption or speech-to-text call) at a time, rather than fanning requests out concurrently; plan run time accordingly for large lists. There is no separate batch endpoint or upload file — the array input is the batching mechanism.

⬇️ Input

All input arrives as one JSON object matching the Actor's input schema. Nothing is required — an empty run simply returns nothing, and a run with videoUrls unset logs "No URLs provided." and exits without pushing any rows.

ParameterRequiredTypeDefaultConstraints
videoUrlsNoarray of strings[]stringList editor. One public Reel URL per line, e.g. https://www.facebook.com/reel/1076980157988172. The legacy key urls is still accepted and, if present, takes priority over videoUrls.
textExtractionNostring"auto"Enum: "auto" (caption track, then speech-to-text if enabled), "captionsOnly" (caption track only, no external calls), "speechToTextOnly" (speech-to-text only, requires an API key), "off" (video record only, no transcript). Unrecognised values fall back to "auto" with a logged warning.
transcriptFormatNostring"text"Enum: "text" (plain paragraph), "srt" (SRT subtitles), "vtt" (WebVTT subtitles), "cues" (JSON array of {start, end, text}). Unrecognised values fall back to "text" with a logged warning.
captionLanguageNostringnoneFree-text locale, e.g. en_US or en. Leave blank to take the Reel's first listed caption track. If the named language is not among the Reel's available tracks, the row's status is requested_language_not_available — the Actor does not substitute a different language.
enableSpeechToTextNobooleanfalseWhen true, Reels with no usable caption track have their audio downloaded and sent to the transcription endpoint below. This calls a third-party service you pay for directly and adds runtime to the row.
speechToTextApiKeyNostring (secret)noneYour key for the transcription endpoint. Marked as a secret input — masked in the Apify Console and never written to the dataset output. Leave empty to keep the Actor fully keyless; speech-to-text rows will report speech_to_text_no_api_key instead of failing the run.
speechToTextApiUrlNostring"https://api.openai.com/v1/audio/transcriptions"Any OpenAI-compatible /audio/transcriptions endpoint.
speechToTextModelNostring"whisper-1"Model name passed to the transcription endpoint.
speechToTextMaxAudioMbNointeger20Minimum 1, maximum 24. Values outside that range are clamped, not rejected. Audio download stops once this many megabytes have been buffered, before transcription is attempted.
proxyConfigurationNoobject{"useApifyProxy": false}Standard Apify Proxy input. Reel pages resolved without a proxy in the Actor's own testing; enable one if you're scraping at volume or see block-like errors.

Common pitfall: the single most frequent mistake is pasting a profile-style link (/username/videos/<id>/) or a /watch/?v= link instead of a /reel/<id> link. Per the Actor's own extraction logic, only Reel-shaped URLs carry the requested video's data when fetched logged-out — the other two page shapes return a full HTTP 200 page in which the requested video is simply absent. Those rows are pushed to the dataset as status: "Failed" and are not charged — they cost you nothing, but they also return no data, so use the /reel/<id> form whenever one exists.

⬆️ Output

Every run pushes one dataset item per input URL, as typed, normalized JSON with a consistent schema across runs. Export as JSON, CSV, Excel, XML, RSS, or HTML from the Dataset tab, or read it via the Apify API / apify_client.

Only rows that clear the Actor's validity gate — the requested video ID actually resolves in the page and carries at least one media format — are billed, via the row_result charged event. Rows for dead URL shapes (wrong page type, deleted video, or a URL with no video ID at all) and rows that hit a network or parsing exception are pushed uncharged; filter them out with status === "Failed", or keep only billed rows with status === "Success".

Scraped results

[
{
"title": "We're fishing today, best bait on this pole 🎣",
"description": "We're fishing bite x2 best bait on this pole thank you very much #fishing #outdoors @baitshopco",
"uploader": null,
"uploader_id": "100064012345678",
"thumbnail": "https://scontent.xx.fbcdn.net/v/t15.5256-10/thumb_1076980157988172.jpg",
"duration": 14.5,
"id": "1076980157988172",
"formats": [
{
"format_id": "audio",
"manifest_url": "https://video.xx.fbcdn.net/manifest/1076980157988172.mpd",
"ext": "m4a", "width": null, "height": null, "tbr": 128.0, "asr": 44100, "fps": null,
"language": null, "format_note": "DASH audio", "filesize": 232000, "container": "m4a_dash",
"vcodec": "none", "acodec": "mp4a.40.2", "dynamic_range": null,
"url": "https://video.xx.fbcdn.net/audio/1076980157988172_128k.mp4",
"manifest_stream_number": 0, "is_dash_periods": true, "protocol": "https",
"audio_ext": "m4a", "video_ext": "none", "audio_channels": 2,
"vbr": 0, "abr": 128.0, "resolution": "audio only", "aspect_ratio": null,
"format": "audio - audio only (DASH audio)"
},
{
"format_id": "video_720", "manifest_url": "https://video.xx.fbcdn.net/manifest/1076980157988172.mpd",
"ext": "mp4", "width": 720, "height": 1280, "tbr": 1450.0, "asr": null, "fps": 30.0,
"language": null, "format_note": "DASH video", "filesize": 2628000, "container": "mp4_dash",
"vcodec": "avc1.640020", "acodec": "none", "dynamic_range": "SDR",
"url": "https://video.xx.fbcdn.net/video/1076980157988172_720p.mp4",
"manifest_stream_number": 0, "is_dash_periods": true, "protocol": "https",
"video_ext": "mp4", "audio_ext": "none", "abr": 0, "vbr": 1450.0,
"resolution": "720x1280", "aspect_ratio": 0.56,
"format": "video_720 - 720x1280 (DASH video)"
}
],
"timestamp": 1747670400,
"automatic_captions": {},
"subtitles": {},
"webpage_url": "https://www.facebook.com/100064012345678/videos/1076980157988172/",
"original_url": "https://www.facebook.com/reel/1076980157988172",
"webpage_url_basename": "1076980157988172",
"webpage_url_domain": "facebook.com",
"extractor": "facebook",
"extractor_key": "Facebook",
"playlist": null,
"playlist_index": null,
"thumbnails": [{ "url": "https://scontent.xx.fbcdn.net/v/t15.5256-10/thumb_1076980157988172.jpg", "id": "0" }],
"display_id": "1076980157988172",
"fulltitle": "We're fishing today, best bait on this pole 🎣",
"duration_string": "0:14",
"upload_date": "20250519",
"release_year": null,
"requested_subtitles": null,
"_has_drm": null,
"epoch": 1753478400,
"requested_formats": [
{ "format_id": "video_720", "format": "video_720 - 720x1280 (DASH video)" },
{ "format_id": "audio", "format": "audio - audio only (DASH audio)" }
],
"format": "video_720 - 720x1280 (DASH video)+audio - audio only (DASH audio)",
"format_id": "video_720+audio",
"ext": "mp4",
"protocol": "https+https",
"language": null,
"format_note": "DASH video+DASH audio",
"filesize_approx": 2860000,
"tbr": 1578.0,
"width": 720,
"height": 1280,
"resolution": "720x1280",
"fps": 30.0,
"dynamic_range": "SDR",
"vcodec": "avc1.640020",
"vbr": 1450.0,
"stretched_ratio": null,
"aspect_ratio": 0.56,
"acodec": "mp4a.40.2",
"abr": 128.0,
"asr": 44100,
"audio_channels": 2,
"transcript": "We're fishing bite x2 best bait on this pole thank you very much",
"transcriptFormat": "text",
"transcriptSource": "platform_caption_track",
"transcriptSourceDetail": "GENERATED_BY_FACEBOOK",
"transcriptLanguage": "en_US",
"transcriptIsOfficialCaptionTrack": true,
"transcriptCueCount": 5,
"transcriptStatus": "ok_caption_track",
"captionTracksAvailable": [{ "locale": "en_US", "creationMethod": "GENERATED_BY_FACEBOOK" }],
"descriptionHashtags": ["fishing", "outdoors"],
"descriptionMentions": ["baitshopco"],
"validityReason": "ok",
"status": "Success"
},
{
"title": "Studio session, new track dropping soon",
"description": "Studio session, new track dropping soon 🎧 #newmusic",
"uploader": null,
"uploader_id": "100064098765432",
"id": "958214722841903",
"duration": 22.0,
"formats": [],
"transcript": "1\n00:00:00,000 --> 00:00:04,200\nStudio session\n\n2\n00:00:04,200 --> 00:00:08,900\nnew track dropping soon\n",
"transcriptFormat": "srt",
"transcriptSource": "speech_to_text",
"transcriptSourceDetail": "whisper-1",
"transcriptLanguage": null,
"transcriptIsOfficialCaptionTrack": false,
"transcriptCueCount": 2,
"transcriptStatus": "ok_speech_to_text",
"captionTracksAvailable": [],
"descriptionHashtags": ["newmusic"],
"descriptionMentions": [],
"validityReason": "ok",
"status": "Success"
},
{
"title": "Live from the market",
"description": "Live from the market this morning",
"uploader": null,
"uploader_id": "100064011122233",
"id": "784419922011834",
"duration": 41.2,
"formats": [],
"transcript": null,
"transcriptFormat": null,
"transcriptSource": null,
"transcriptSourceDetail": null,
"transcriptLanguage": null,
"transcriptIsOfficialCaptionTrack": null,
"transcriptCueCount": null,
"transcriptStatus": "no_caption_track_speech_to_text_disabled",
"captionTracksAvailable": [],
"descriptionHashtags": [],
"descriptionMentions": [],
"validityReason": "ok",
"status": "Success"
}
]

A dead URL shape (a /videos/ or /watch/?v= page, or a URL with no video ID) is pushed as a much smaller, uncharged row instead:

{
"title": null,
"description": null,
"id": "958214722841903",
"formats": [],
"status": "Failed",
"error": "No video data on page (video_not_present_on_page).",
"validityReason": "video_not_present_on_page",
"transcript": null,
"transcriptStatus": "not_attempted_invalid_row",
"descriptionHashtags": [],
"descriptionMentions": []
}

And a row that hits a network or parsing exception is pushed with only four keys, also uncharged:

{
"url": "https://www.facebook.com/reel/0000000000000",
"original_url": "https://www.facebook.com/reel/0000000000000",
"status": "Failed",
"error": "RuntimeError: Failed to fetch after 3 attempts: ..."
}

Beyond the dataset, the Actor writes a SUMMARY.json file to the run's key-value store with run-level counts: total_requested, charged_rows, empty_rows_not_charged, failed_rows_not_charged, transcripts_from_caption_track, transcripts_from_speech_to_text, rows_without_transcript, and a stats map of each input URL to its outcome string.

Fields that are always present but always null: uploader is carried in every row's shape but is never populated (only uploader_id is derived from the page); automatic_captions and subtitles are always empty objects — the actual transcript lives in the transcript/transcriptSource fields, not in these two, which exist for shape compatibility with yt-dlp-style tooling; playlist, playlist_index, release_year, requested_subtitles, and _has_drm are always null for a single-Reel extractor.

How can I use the data extracted with Facebook Reel Transcript Scraper?

  • 📱 Content and social media teams: turn a competitor's or your own back-catalogue of Reels into searchable text, repurpose the transcript field into blog posts or captions, and ship the srt/vtt output straight to a video editor or player for accessibility subtitles.
  • 🤖 AI engineers and LLM developers: feed transcript plus description, descriptionHashtags, and descriptionMentions as grounded context to an agent or RAG pipeline — the transcriptIsOfficialCaptionTrack flag lets you weight publisher captions above machine transcripts in a retrieval pipeline.
  • 📈 Market and competitive researchers: track which hashtags and accounts a brand's Reels mention over time by diffing descriptionHashtags and descriptionMentions between scheduled runs of the same URL list.
  • Accessibility and localization teams: request transcriptFormat: "vtt" or "srt" to generate subtitle files directly, and use captionLanguage to pull whichever locale track a Reel already has before deciding whether a translation pass is needed.

📈 How do you monitor transcript coverage over time?

Facebook doesn't caption every Reel the moment it's published — a track can appear days later, or never. Monitoring transcript coverage means re-running the same list of Reel URLs on a schedule and diffing transcriptStatus, transcriptSource, and captionTracksAvailable between runs to see what changed. A row moving from no_caption_track to ok_caption_track tells you Facebook (or the publisher) added a caption track since your last check; a growing captionTracksAvailable array tells you a new locale was published. If you've enabled speech-to-text, watch transcriptIsOfficialCaptionTrack flip from false to true — that's your signal to drop the machine transcript in favor of the now-available publisher caption, since the official track is generally the more trustworthy source.

A practical loop: keep a fixed list of Reel URLs you care about (a creator's recent output, a campaign's Reels, a competitor's feed), run the Actor against that list on a recurring Apify Schedule, and alert on any row where transcriptStatus changed since the previous run. The Actor has no built-in cron or webhook of its own — scheduling and delivery are handled through the Apify platform's Schedule and Integrations features on the Actor's page.

Integrate Facebook Reel Transcript Scraper and automate your workflow

Facebook Reel Transcript Scraper works with any language or tool that can send an HTTP request, because it runs as a standard Apify Actor.

REST API with Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
"videoUrls": ["https://www.facebook.com/reel/1076980157988172"],
"textExtraction": "auto",
"transcriptFormat": "srt",
}
run = client.actor("<YOUR_USERNAME>/facebook-videos-scraper-spoken-text-transcript").call(
run_input=run_input
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["id"], item["transcriptStatus"], item.get("transcript"))

Scheduled monitoring and delivery

Set up an Apify Schedule on the Actor to re-run the same videoUrls list on an interval, and attach a webhook on run completion to push the finished dataset to your own endpoint, or pull it on demand through the Apify API. There is no dataset-push webhook built into the Actor itself — delivery is the standard Apify Schedule-plus-webhook pattern, available to any Actor on the platform.

Scraping publicly accessible web pages is generally lawful in the United States — courts have found that data a website makes visible without a login is not protected under the Computer Fraud and Abuse Act (hiQ Labs, Inc. v. LinkedIn Corp., 9th Cir., 2019). Facebook Reel Transcript Scraper returns only what any logged-out visitor to a public Reel page can already see: the video's own metadata, formats, description, and its own published or machine-generated caption text.

That said, Meta's Terms of Service separately restrict automated data collection, and your downstream use is what carries legal risk, not the act of viewing a public page. Transcripts and descriptions can contain personal data — names, statements, or descriptionMentions referring to identifiable people — so GDPR, CCPA, and equivalent regimes may apply once you store or process that data yourself; the Actor doesn't retain anything after your run finishes. Scraping for internal monitoring carries a different risk profile than scraping to build a training corpus. Consult your legal team for commercial use cases involving bulk data storage.

❓ Frequently asked questions

Does Facebook Reel Transcript Scraper need a Facebook login?

No. It fetches public Reel pages logged-out, using standard browser headers — no session cookie, sessionid, or account credential of any kind is accepted or required as input.

Can I request a specific caption language?

Yes, with captionLanguage. Set it to a locale like en or en_US. If the Reel doesn't have a track in that language, the row's transcriptStatus reports requested_language_not_available rather than silently returning whatever language was available — you always know when you got what you asked for.

Does Facebook Reel Transcript Scraper extract hashtags and mentions?

Yes — descriptionHashtags and descriptionMentions, mined from the requested Reel's own description text (not a sibling video's, thanks to the Actor's page-anchoring logic) and returned as deduplicated arrays without the leading # or @.

How many Reels can I scrape per run?

There's no result cap enforced by the Actor itself — it processes every URL you put in videoUrls. The practical ceiling is your run's timeout and memory budget on your Apify plan, and, if enableSpeechToText is on, the rate and cost limits of your own transcription API key.

How does Facebook Reel Transcript Scraper handle blocked or rate-limited requests?

Each fetch retries up to 3 times with a short backoff between attempts. If a response looks like a block (HTTP 403/429, an access-denied or checkpoint page, or a region restriction) and the run wasn't already using a proxy, the Actor automatically switches to an Apify RESIDENTIAL proxy for the remaining retries on that URL — this can happen even if you left proxyConfiguration off, so budget for occasional proxy usage on runs that hit blocks at volume.

What happens if a Reel has no caption track and speech-to-text is off?

You still get the full video record — title, description, formats, hashtags, mentions — with transcript: null and a transcriptStatus explaining why (no_caption_track in captionsOnly mode, or no_caption_track_speech_to_text_disabled in auto mode with enableSpeechToText left off). You are never charged extra for the missing transcript; it's part of the same row.

How do I use Facebook Reel Transcript Scraper to monitor a creator's captions over time?

Keep a fixed videoUrls list, run it on a recurring Apify Schedule, and diff transcriptStatus, transcriptSource, and captionTracksAvailable against the previous run's dataset. A status change from no_caption_track to ok_caption_track means Facebook or the publisher added a caption track since your last check.

Does Facebook Reel Transcript Scraper work with Claude, ChatGPT, and AI agent frameworks?

It's callable as a standard HTTP endpoint by any agent framework via the Apify API or apify_client — an agent can trigger a run, poll for completion, and read back structured JSON (including the transcript field) as grounded context before answering. There is no dedicated MCP server documented for this Actor.

How does Facebook Reel Transcript Scraper compare to other Facebook transcript scrapers?

As checked on the Apify Store on 2026-07-26: unseenuser/fb-transcript returns only Facebook's existing caption text, with no speech-to-text fallback and a documented cap of videos under roughly two minutes, in a fixed newline/plain-text/lines[] shape. invideoiq/video-transcript-scraper covers more platforms in one Actor but requires a separate companion Actor (Video Transcriber) for speech-to-text and returns a fixed timestamped-array shape with no SRT/VTT export. Facebook Reel Transcript Scraper is the only one of the three, as documented on their listings, that combines a caption-track path and an optional speech-to-text fallback in a single run with an explicit per-row transcriptIsOfficialCaptionTrack flag and four selectable output formats.

Can I use Facebook Reel Transcript Scraper without managing proxies or Facebook credentials?

Yes. No Facebook account, cookie, or API credential is required — videoUrls is the only input most users need. Proxy handling is optional and automatic where it matters: leave proxyConfiguration off for normal use, or turn it on if you're scraping at volume and want a proxy from the start rather than relying on the Actor's automatic block-triggered fallback.

💬 Your feedback

Found a bug, hit an unexpected transcriptStatus, or need a field this Actor doesn't return? Open an issue on the Actor's Issues tab in the Apify Console, or reach out to Scrapier through the Actor's Apify Store page. Reports on real runs are what keep this Actor accurate as Facebook's page structure changes.