100 free credits on signup · no card required

Facebook Transcript API

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.

Credits 15 / video
Input ?url=
Cache
GET · BEARER
Request composing…
Cached forever
same bytes every call

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.

Works with your stack
cURL Python Node.js Zapier n8n Make MCP
One key · one credit balance · plain REST

The difference

Stop parsing markup. Start reading fields.

On the left, what a headless browser hands you. On the right, what the endpoint hands you.

Scraping it yourself raw HTML · every call
<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...
×Class names rotate; your selectors break weekly ×Headless browsers, proxies, blocks to babysit ×Counts arrive as strings, not numbers
One GET request 4 typed fields
{
"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"
}
Stable field names, documented nulls No proxies, no browser, no login session Counters are integers you can sort on

The payload

What comes back

{ data, meta?, request_id }
01 Transcript as one string

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.

02 Language, source and segments

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.

03 Every URL 404s today

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.

Field explorer Pick a key to see its type and the caveats.
string Always set Per item
source

Which leg produced the text. On Facebook the only possible value is "whisper". Always present, including on responses served from the stored transcript corpus.

{
"text": "Today I want to show you the three settings everyone ignores when they set this up for the first time...",
"segments": [ … ],
"language": "en",
"source": "audio"
}
Good fit

Reach for this when

  • You are running a mixed-platform pipeline and want one code path for transcripts across TikTok, Instagram and Facebook, accepting that the Facebook branch 404s today and treating that as a normal outcome.
  • You want your integration written and tested now so that it starts returning data the day transcription is switched back on, without a code change on your side.
  • You need the exact wording of a public video for a compliance or claims-review file, and paraphrasing from a summary will not stand up — in which case check first whether the same content exists on TikTok.
Different job?

There's an endpoint for that

  • You need transcripts for Facebook video today. This endpoint cannot give you that, and no parameter changes it. Download the media with the Facebook Video Download API and run your own speech-to-text over it.
  • You want the text of the post itself rather than the words spoken in the video — that is the Facebook Post Stats API, which returns the post copy along with reaction and share counts.
  • You want audience reaction rather than the video's own words — the Facebook Comments API returns comment text with authors.
  • You want transcripts that reliably exist. TikTok ships subtitles inside its public payload, so the TikTok Transcript API succeeds far more often and costs less per call.

Pricing

Start free, pay for what comes back

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 your bill
$43/ month
30 videos/day × 15 credits × 365 days = 164,250 credits/yr, or $513/yr on the annual plan plus 153 top-up blocks Whichever plan is cheaper for that volume, divided by 12.
30
102,000
Credits / yr 164,250
Plan Annual $54/yr
Per video

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.

Free trial
100 credits

On signup, no card. Your key is on screen immediately.

Get your free API key
Monthly $5/mo 1,000 credits. Top-ups $4 per extra 1,000.
Annual $54/yr 12,000 credits. Top-ups $3 per extra 1,000.

Entry price, side by side

Cheapest way to start

Verified July 2026 from each vendor's live pricing page
ScraperSocial
$5 / mo 1,000 credits · 100 free credits, no card
Supadata
$5 / mo 300 credits, annual commitment · 100 free/mo
SocialKit
$29 / mo 12,000 credits · 20 free credits
Dumpling AI
$40 / mo Billed annually · free tier size unpublished
ScrapeCreators
$47 pack 25,000 credits, no subscription · 100 free once

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

Docs you can build on

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.

Failed calls are never charged Public data only, no login session Built for parallel traffic

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

Frequently asked

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

Pairs well with

Full Facebook API reference →
/v1/tiktok/transcript
TikTok Transcript API Full transcript of a TikTok video with timestamped segments. 8 cr / video
/v1/instagram/transcript
Instagram Transcript API Full transcript of an Instagram reel with timestamped segments. 40 cr / reel
/v1/facebook/download
Facebook Download API Resolves a downloadable media URL for a Facebook video (URL expires within 1h). 10 cr / video
/v1/facebook/stats
Facebook Stats API Reactions, comments and shares for a Facebook post or video. 5 cr / post

More Facebook endpoints

/v1/facebook/summary Short AI summary of a Facebook video, built on its transcript. 17 credits / video /v1/facebook/stats Reactions, comments and shares for a Facebook post or video. 5 credits / post /v1/facebook/comments Paginated comments on a Facebook post; charged per comment returned. 3 credits / comment /v1/facebook/page-stats Followers, likes and metadata for a Facebook page. 10 credits / page /v1/facebook/channel-posts Latest posts from a Facebook page with per-post metrics. 3 credits / post /v1/facebook/download Resolves a downloadable media URL for a Facebook video (URL expires within 1h). 10 credits / video

Try the Facebook Transcript endpoint free

100 trial credits on signup — no card, key on screen immediately.

1 Sign up free no card · 30 seconds
2 Copy your key sk_live_...
3 GET the endpoint /v1/facebook/transcript
Get your free API key