LinkedIn Post Transcript API
Get the captions of a video post as text with timings, in the language you choose.
- 1 credit per call
- Failed calls are free
- Updated
- linkedin.post.transcript.get
{ "text": "It's just so cool to be able to put a piece of my country\nin a place like Times Square, you know? It's insane to\nthink about. My name is He…", "available": true, "count": 22, "language": "en", "matched_count": 22, "url": "https://www.linkedin.com/feed/update/urn:li:activity:7508957863713714180", "video_count": 1, "video_index": 0, "available_languages": [ "en" ], "segments": [ { "text": "It's just so cool to be able to put a piece of my country", "end_seconds": 4.077, "start_seconds": 0.36 }, { "text": "in a place like Times Square, you know? It's insane to", "end_seconds": 7.601, "start_seconds": 4.077 } ]}
What you send
The input
object of the request, with every field the endpoint accepts.
| Field | Type | Required | What it does | Example |
|---|---|---|---|---|
| url | string | yes | Public LinkedIn post URL, numeric activity ID, or urn:li:activity:<id>. A caption URL is never required or accepted. | https://www.linkedin.com/feed/update/urn:li:act… |
| end_seconds | number | no | Exclusive upper time bound, greater than start_seconds. Omit for the complete exposed file. At least 0. | |
| format | string | no | Return transcript text, timed segments, or both. count reports selected cues even for text-only output. Allowed values: text, segments, both. Default: both. |
both |
| language | string | no | Optional exposed-language match, e.g. en. Does not translate or request an unobserved track. | |
| max_segments | integer | no | Maximum matching cues returned. The source is one caption file, not a paginated endpoint. From 1 to 5000. Default: 2000. |
2000 |
| start_seconds | number | no | Include cues overlapping this lower bound, preserving original cue timestamps. At least 0. Default: 0. |
|
| video_index | integer | no | Zero-based video position within the public post. From 0 to 20. Default: 0. |
Fields it returns
What each record in the response holds, with the values from the sample above.
| Field | Type | What it is | Example |
|---|---|---|---|
| text | string | The whole transcript as text. | It's just so cool to be able to put a piece of my country in a … |
| available | boolean | Whether captions exist for the video. | true |
| available_languages | array | Caption languages the video has. | en |
| count | integer | Parts in this response. | 22 |
| language | string | The caption language returned. | en |
| matched_count | integer | Parts that match your time window. | 22 |
| segments | array | The transcript in timed parts. | 22 records |
| segments[].end_seconds | number | When the part ends, in seconds. | 4.08 |
| segments[].start_seconds | number | When the part starts, in seconds. | 0.36 |
| segments[].text | string | What is said in this part. | It's just so cool to be able to put a piece of my country |
| url | string | The post the video is in. | https://www.linkedin.com/feed/update/urn:li:activity:7508957863… |
| video_count | integer | Videos in the post. | 1 |
| video_index | integer | Which video in the post was read, counting from 0. | 0 |
Call it from your code, or ask your agent
Set UPSCRAPE_API_KEY to your key and copy a working request.
curl --request POST \ --url https://data.upscrape.com/execute \ --header "Authorization: Bearer $UPSCRAPE_API_KEY" \ --header "Content-Type: application/json" \ --header "Prefer: wait=30" \ --data '{ "capability": "linkedin.post.transcript.get", "input": { "format": "both", "max_segments": 2000, "url": "https://www.linkedin.com/feed/update/urn:li:activity:7508957863713714180/" }}'
import jsonimport osimport requestspayload = json.loads(r'''{ "capability": "linkedin.post.transcript.get", "input": { "format": "both", "max_segments": 2000, "url": "https://www.linkedin.com/feed/update/urn:li:activity:7508957863713714180/" }}''')response = requests.post( "https://data.upscrape.com/execute", headers={ "Authorization": f"Bearer {os.environ['UPSCRAPE_API_KEY']}", "Content-Type": "application/json", "Prefer": "wait=30", }, json=payload,)response.raise_for_status()print(json.dumps(response.json(), indent=2))
const response = await fetch("https://data.upscrape.com/execute", { method: "POST", headers: { "Authorization": `Bearer ${process.env.UPSCRAPE_API_KEY}`, "Content-Type": "application/json", "Prefer": "wait=30", }, body: JSON.stringify({ "capability": "linkedin.post.transcript.get", "input": { "format": "both", "max_segments": 2000, "url": "https://www.linkedin.com/feed/update/urn:li:activity:7508957863713714180/" }}),});if (!response.ok) { throw new Error(`Upscrape request failed: ${response.status}`);}console.log(JSON.stringify(await response.json(), null, 2));
https://data.upscrape.com/mcp
With Upscrape, get the LinkedIn post transcript for format "both", max segments "2000" and https://www.linkedin.com/feed/update/urn:li:activity:7508957863713714180/. Tell me what it costs before you run it, then show the results as a table.
More from the LinkedIn API
- LinkedIn Profile API1 credit
- LinkedIn Company API1 credit
- LinkedIn Jobs Search API1 credit
- LinkedIn Job API1 credit
- LinkedIn Company Jobs API1 credit
- LinkedIn Company Posts API1–7 credits
- LinkedIn Post API1 credit
- LinkedIn Article API1 credit
- LinkedIn Newsletter API1 credit
- LinkedIn Company Life Page API1 credit
- LinkedIn Showcase Page API1 credit
- LinkedIn Company Suggestions API1 credit
- LinkedIn Learning Course API1 credit
The same data from other platforms
LinkedIn Post Transcript API FAQ
The short answers. The docs have the long ones.
How much does the LinkedIn Post Transcript API cost?
1 credit per successful call, shown before it runs. You buy credits once, and paid credits never expire.
What do I send?
Send url. The input fields below list every option with its type and limits.
Do I need a LinkedIn login?
No. It reads public LinkedIn data; nothing runs on your account.
Can my AI agent call it?
Yes, over MCP: the agent finds linkedin.post.transcript.get, checks its price and runs it with the same credits as the REST API.
Your first LinkedIn call is free.
Up to 100 free credits to start, no card needed.