One URL in. Clean JSON out.
This endpoint returns a Facebook video's spoken words as plain text. Read the next sentence before you plan around it: the transcription leg is switched off at launch, and the only shortcut still running reads subtitles a platform ships inside its own public payload — which Facebook does not. In practice that means this call returns 404 on Facebook URLs today. It is listed here because the route exists and the pipeline behind it is real, not because we think it will solve your problem right now.
Availability: Caption-dependent: transcripts are available only when the video has captions on Facebook, which most Facebook videos don't. When no captions exist the API returns a 404 no-transcript error, and failed calls are never charged.
The difference
On the left, what a headless browser hands you. On the right, what the endpoint hands you.
<div class="x1yztbdb x1n2onr6 xh8yej3" data-visualcompletion="ignore"><div class="x78zum5 xdt5ytf"><div dir="auto" class="xdj266r x11i5rnm x1mh8g0r">Weekend build: three settings we changed after your feedback</div></div><div class="x9f619 x1ja2u2z x78zum5"><span class="xt0b8zv x1jx94hy" aria-label="5.2K reactions"><i data-visualcompletion="css-img"></i></span><span class="x193iq5w">331 comments</span><span class="x1s688f">128 shares</span></div><abbr data-utime="1751630400" class="x1i10hfl">3d</abbr><script>requireLazy(["CometResourceScheduler"],function(f){f().schedule({"__bbox":{"require":[["adp_Comet... {"data": {"platform": "facebook","entity_id": "1093831344793765","language": "en","source": "audio","text": "Today I want to show you the three settings everyone ignores when they set this up for the first time...","segments": [{"start": 0,"end": 3.2,"text": "Today I want to show you the three settings"},{"start": 3.2,"end": 5.9,"text": "everyone ignores when they set this up"}]},"request_id": "req_01JZX4M8Q2TE9W"}
The payload
On a success, one object per video. The payload is `text` — the whole transcript flattened into a single continuous string, with cue numbering and timing markers stripped out.
Three smaller fields ride along. `language` is the detected language code, `source` names the leg of the pipeline that produced the text, and `segments` holds timestamped chunks. On Facebook there is only one leg that can produce a transcript — the speech-to-text one — so `source` reads `whisper` and `segments` is populated rather than null.
Everything else is a failure path, and the honest expectation is that you will spend all of your time there while transcription is disabled. The call returns 404 with `not_found` rather than an empty string or an invented approximation, and 404s are not charged.
Which leg produced the text. On Facebook the only possible value is "whisper". Always present, including on responses served from the stored transcript corpus.
Pricing
A successful transcript is 15 credits — about 7.5¢ on the monthly plan, or roughly 67 videos for $5 — but with transcription off, Facebook calls 404 and failed calls are never charged.
Estimate only, on a full-year basis. 15 credits per returned video. Monthly: $5 per 1,000 credits with $4/1,000 top-ups. Annual: $54 per 12,000 credits with $3/1,000 top-ups. We show whichever plan is cheaper for your annual volume, divided by 12. Failed calls are never charged; cache hits cost the same as fresh calls.
Entry price, side by side
Credits are not equivalent units across vendors — each meters differently. Price your own workload on both before deciding on entry price alone. At high volume, several of these are cheaper per credit than we are.
Engineering notes
We document exactly how every endpoint behaves — nulls, caching, billing — so what you ship on day one is still running in month six. No surprises, no support tickets.
Speech recognition is switched off at launch. The one path still running takes subtitles that a platform already ships inside its public payload, and Facebook does not ship them, so there is nothing for the pipeline to read. Facebook URLs return 404 with `not_found`. That is the expected result, not a fault to report.
Nothing on your side changes it. `fresh=true` re-checks upstream, and the second attempt fails exactly like the first. If your project depends on transcripts for Facebook content, this endpoint is the wrong tool and we would rather you know that now than after you have wired it in.
A successful transcript is 15 credits per video. Failed calls are never charged, so a run of 404s costs you nothing but latency and request slots. The cost model here is genuinely unusual: your spend tracks your success rate, not your URL count, and on Facebook that rate is currently zero.
The only sane plan is to try and handle the 404. Probe a sample of URLs from your target pages before you build anything around the result — what comes back on your specific corpus is the number that decides whether this endpoint is worth wiring in at all.
Transcripts sit in the immutable cache class. Spoken words do not change after posting, so once a video has been transcribed we keep the text permanently and never re-fetch it. Repeat calls for the same video come back in milliseconds off stored text.
The stored copy carries the same four fields as a fresh one — `text`, `segments`, `language` and `source` — so a cached response and a first-time response are the same shape and you do not need two code paths.
We read logged out, the same way any visitor does. Private posts, friends-only video, group content behind a membership wall, and anything geo-restricted from our vantage point are not reachable and return an error rather than a partial object. We do not sign in, and we do not go around access controls.
Live video is a poor fit for a different reason: a stream that has not finished has no settled caption track, so results during a broadcast are unreliable at best.
Any transcript this endpoint can ever return is machine-produced, and it reads like it. Proper nouns, brand names and numbers are the usual casualties. Do not quote a transcript verbatim in anything consequential without checking the audio, and do not build exact-match keyword rules on top of text that may have misheard the keyword.
Questions
Not at the moment. Speech recognition is disabled at launch, and the remaining shortcut only works on platforms that publish subtitles in their own payload — Facebook does not. Facebook URLs return a 404 that we do not charge for. If you need coverage across Facebook video, plan on running your own transcription over downloaded media.
Because there is currently no leg of the pipeline that can produce a Facebook transcript: the speech-to-text step is switched off, and Facebook does not hand us subtitles the way some platforms do. Separately, private, group-restricted, deleted or unfinished-live content is unreachable in any case. The error body carries `not_found`, and retrying or adding fresh=true will return the same thing.
15 credits per video that actually returns a transcript. Credits are $0.005 each on the monthly plan and $0.0045 on annual, so a successful call is roughly 7.5 cents. Failed calls — which today means every Facebook call — are not charged. Repeat calls for a video we have already transcribed are served from permanent storage.
That is the design, and it is the only way Facebook could ever be served here, but the speech-to-text leg is turned off at launch. We would rather ship the route with an honest 404 than switch on a transcription bill and an accuracy profile we have not committed to publicly. When it comes back on, the `source` field on Facebook responses will read `whisper`.
Whatever language was spoken. The `language` field carries the code the pipeline detected, and it is null when none could be attached. There is no translation step. A Portuguese video returns Portuguese text, so branch on `language` before you feed the string to anything language-sensitive.
Yes, when a Facebook transcript succeeds at all. The `segments` field holds { start, end, text } objects with seconds as numbers, and the speech-to-text leg — the only one that can serve Facebook — populates it. Keep the field typed nullable, because other platforms reach transcripts by a route that discards timings.
TikTok. TikTok ships subtitles inside its public payload, which is the one path still switched on, so the TikTok Transcript API succeeds on a large share of URLs and costs 8 credits instead of 15. If your research question can be answered on TikTok rather than Facebook, that is the cheaper and far more reliable route to spoken-word data.
Next
100 trial credits on signup — no card, key on screen immediately.