Facebook video transcript API
Transcript of a video post or reel: existing captions first, otherwise AI transcription of the audio.
GET /v1/facebook/post/transcript
GET /v1/facebook/post/transcript
Transcript of a video post or reel: existing captions first, otherwise AI transcription of the audio.
- Cost: 1 credit for captions; AI transcription 1 up to 2 minutes, then 5 per started minute of the whole video
- Cache: Results are kept up to 30 days; send
max_age_daysto reuse them for free. - Timeout: A request still running after about 25 seconds answers
202with a job to poll (Batch and jobs).
Parameters#
| Name | Type | Required | Description |
|---|---|---|---|
url | URL | yes | Post, video or reel URL. Accepted hosts: facebook.com, fb.com, fb.watch. |
allow_long_transcription | boolean | no | Transcribe audio past 2 minutes with AI, at 5 credits per started minute of the whole video. Without it a longer video answers transcript_unavailable, which is free. Default false. Also accepted as allowLongTranscription. |
Every request also accepts:
trim:truefor a smaller response withoutnullfields andextra.raw:trueto also get the platform's original object asraw.max_age_days: accept a cached result up to this many days old, for 0 credits (Caching).
Example request#
Set your key in the environment first (see Authentication).
1curl -G "https://api.socialscrape.dev/v1/facebook/post/transcript" \2 -H "x-api-key: $SOCIALSCRAPE_API_KEY" \3 --data-urlencode "url=https://www.facebook.com/reel/1803909017420449/"1import os2import requests34params = {5 "url": "https://www.facebook.com/reel/1803909017420449/",6}7res = requests.get(8 "https://api.socialscrape.dev/v1/facebook/post/transcript",9 headers={"x-api-key": os.environ["SOCIALSCRAPE_API_KEY"]},10 params=params,11)12body = res.json()1314if body["ok"]:15 print(body["data"])16else:17 print(body["error"]["code"], body["error"]["message"])1const url = new URL("https://api.socialscrape.dev/v1/facebook/post/transcript");2url.search = new URLSearchParams({3 "url": "https://www.facebook.com/reel/1803909017420449/"4}).toString();5const res = await fetch(url, {6 headers: { "x-api-key": process.env.SOCIALSCRAPE_API_KEY! },7});8const body = await res.json();910if (body.ok) {11 console.log(body.data);12} else {13 console.error(body.error.code, body.error.message);14}1{2 "nodes": [3 {4 "name": "SocialScrape Facebook video transcript",5 "type": "n8n-nodes-base.httpRequest",6 "typeVersion": 4.2,7 "position": [8 0,9 010 ],11 "parameters": {12 "method": "GET",13 "url": "https://api.socialscrape.dev/v1/facebook/post/transcript",14 "sendQuery": true,15 "queryParameters": {16 "parameters": [17 {18 "name": "url",19 "value": "https://www.facebook.com/reel/1803909017420449/"20 }21 ]22 },23 "sendHeaders": true,24 "headerParameters": {25 "parameters": [26 {27 "name": "x-api-key",28 "value": "={{ $env.SOCIALSCRAPE_API_KEY }}"29 }30 ]31 }32 }33 }34 ],35 "connections": {}36}Example response#
This is a sample from a recorded response, lists and long text are shortened. Status 200.
200 OKSample response
1{2 "ok": true,3 "credits_charged": 1,4 "credits_remaining": 4999,5 "cached": false,6 "cached_at": null,7 "request_id": "req_d2d91dc1cdb2346c2edf20f6",8 "data": {9 "object": "transcript",10 "platform": "facebook",11 "video_id": "1803909017420449",12 "url": "https://www.facebook.com/reel/1803909017420449/",13 "language": "en-US",14 "source": "auto_captions",15 "duration_seconds": 59.861,16 "text": "But the standard that we should continuously aspire to exceed, which is why we are bringing that intensity, that discipline, that engineering ownership back to NASA, because great nations do not remain great by being caretakers of history,...",17 "segments": [18 {19 "start": 0.033,20 "end": 4.0,21 "text": "But the standard that we should continuously aspire to exceed,"22 },23 {24 "start": 4.0,25 "end": 7.166,26 "text": "which is why we are bringing that intensity, that discipline, that"27 },28 {29 "start": 7.166,30 "end": 11.4,31 "text": "engineering ownership back to NASA, because great nations do not remain great"32 }33 ],34 "available_languages": [35 "en-US"36 ],37 "extra": null38 },39 "cursor": null,40 "has_more": null41}Response#
A Transcript object in data.
See Data models for every field. The envelope around data is described in Responses.
Errors#
Failures are free: credits_charged is 0. Branch on error.code, never on the message.
| Code | HTTP | Retry | Meaning |
|---|---|---|---|
invalid_params | 400 | no | A parameter is missing, unknown or has the wrong type. |
unsupported_url | 400 | no | The URL is not one this endpoint accepts (wrong platform or form). |
not_found | 404 | no | The platform says this profile, post or item does not exist. |
transcript_unavailable | 404 | no | No captions exist and AI transcription is not possible for this media. |
Every request can also fail with the account and platform errors listed on the Errors page.
Example error:
1{2 "ok": false,3 "error": {4 "code": "transcript_unavailable",5 "message": "No captions exist and AI transcription is not possible for this media.",6 "retryable": false7 },8 "credits_charged": 0,9 "request_id": "req_efe140022d84117cb256b574"10}Related endpoints#
- Facebook Ad Library search (
GET /v1/facebook/ad-library/search) - Facebook Ad Library search (POST body) (
POST /v1/facebook/ad-library/search) - Facebook Ad Library ads by page (
GET /v1/facebook/ad-library/company/ads) - Facebook Ad Library ads by page (POST body) (
POST /v1/facebook/ad-library/company/ads) - Facebook Ad Library ad details (
GET /v1/facebook/ad-library/ad) - Facebook Ad Library ad transcript (
GET /v1/facebook/ad-library/ad/transcript) - Facebook Ad Library advertiser search (
GET /v1/facebook/ad-library/search/companies) - Facebook profile or page (
GET /v1/facebook/profile)