Get the full transcript of a public LinkedIn post: the post body, the author, engagement counters, and the comment bodies that ship inside the same page. Comment bodies cost no extra upstream call. Use it when you need comments, and use the LinkedIn Post endpoint when you only need the post itself. topics and more_articles are empty on feed posts and populated on /pulse/ articles. A repost adds repost_comment (what the reposter wrote) and original_content (the shared post). The Errors section lists the common cases rather than every code: any failed request carries an error_code, and none of them is billed.
Run this endpoint
Endpoint
Parameters
Start with the required fields, then add optional filters only when your use case needs them.
Runnable path
This endpoint has no required query parameters.
2 optional filters available.
string
Optional
LinkedIn post URL. Provide this or activity_id. A /feed/update/urn:li:share:
https://example.com/product
string
Optional
Numeric LinkedIn activity ID. Provide this or url. Always treated as an activity URN; pass a share as its share URL to fetch it as a share.
7123456789012345678
Request Examples
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://scrappa.co/api/linkedin/post/transcript?activity_id=7123456789012345678",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: YOUR_API_KEY_HERE"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
<?php
use Illuminate\Support\Facades\Http;
$response = Http::timeout(30)
->withHeaders(['x-api-key' => 'YOUR_API_KEY_HERE'])
->get('https://scrappa.co/api/linkedin/post/transcript?activity_id=7123456789012345678');
if ($response->successful()) {
echo $response->body();
} else {
echo "Error: " . $response->status();
}
const options = {
method: 'GET',
headers: {
'x-api-key': 'YOUR_API_KEY_HERE'
}
};
fetch('https://scrappa.co/api/linkedin/post/transcript?activity_id=7123456789012345678', options)
.then(response => {
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.text();
})
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
const axios = require('axios');
const options = {
method: 'GET',
url: 'https://scrappa.co/api/linkedin/post/transcript?activity_id=7123456789012345678',
headers: {
x-api-key: 'YOUR_API_KEY_HERE',
}
};
try {
const response = await axios(options);
console.log(response.data);
} catch (error) {
console.error('Error:', error.message);
}
require 'net/http'
require 'uri'
uri = URI.parse("https://scrappa.co/api/linkedin/post/transcript?activity_id=7123456789012345678")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == 'https'
request = Net::HTTP::Get.new(uri.request_uri)
request['x-api-key'] = 'YOUR_API_KEY_HERE'
begin
response = http.request(request)
puts response.body
rescue => e
puts "Error: #{e.message}"
end
import http.client
import json
conn = http.client.HTTPSConnection("scrappa.co")
headers = {
'x-api-key': 'YOUR_API_KEY_HERE',
}
try:
conn.request("GET", "/api/linkedin/post/transcript?activity_id=7123456789012345678", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
except Exception as e:
print(f"Error: {e}")
finally:
conn.close()
import requests
headers = {
'x-api-key': 'YOUR_API_KEY_HERE',
}
try:
response = requests.get('https://scrappa.co/api/linkedin/post/transcript?activity_id=7123456789012345678', headers=headers)
response.raise_for_status()
print(response.text)
except requests.exceptions.RequestException as e:
print(f"Error: {e}")
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class ApiExample {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://scrappa.co/api/linkedin/post/transcript?activity_id=7123456789012345678")
.addHeader("x-api-key", "YOUR_API_KEY_HERE")
.build();
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) {
System.out.println(response.body().string());
} else {
System.out.println("Error: " + response.code());
}
} catch (IOException e) {
System.out.println("Error: " + e.getMessage());
}
}
}
package main
import (
"fmt"
"net/http"
"io/ioutil"
)
func main() {
client := &http.Client{}
req, err := http.NewRequest("GET", "https://scrappa.co/api/linkedin/post/transcript?activity_id=7123456789012345678", nil)
if err != nil {
fmt.Println("Error creating request:", err)
return
}
req.Header.Set("x-api-key", "YOUR_API_KEY_HERE")
resp, err := client.Do(req)
if err != nil {
fmt.Println("Error making request:", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("Error reading response:", err)
return
}
fmt.Println(string(body))
}
#!/bin/bash
curl -X GET \
-H "x-api-key: YOUR_API_KEY_HERE" \
"https://scrappa.co/api/linkedin/post/transcript?activity_id=7123456789012345678"
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY_HERE");
try
{
var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, "https://scrappa.co/api/linkedin/post/transcript?activity_id=7123456789012345678"));
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content);
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
import axios from 'axios';
async function run(): Promise<void> {
try {
const response = await axios({
method: 'GET',
url: 'https://scrappa.co/api/linkedin/post/transcript?activity_id=7123456789012345678',
headers: {
'x-api-key': 'YOUR_API_KEY_HERE',
},
});
console.log(response.data);
} catch (error) {
console.error('Error:', error);
}
}
void run();
use reqwest::Client;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Client::new();
let response = client
.get("https://scrappa.co/api/linkedin/post/transcript?activity_id=7123456789012345678")
.header("x-api-key", "YOUR_API_KEY_HERE")
.send()
.await?;
println!("{}", response.text().await?);
Ok(())
}
Response Schema
Example response fields are illustrative; inspect the JSON before integrating.
Example response fields
Scan these fields before integrating.
success
type
activity_id
is_repost
headline
url
date_published
image
+9 more
Common comments fields
author
text
date_published
like_count
{
"success": true,
"type": "post",
"activity_id": "7123456789012345678",
"is_repost": false,
"headline": "Excited to share our latest product update...",
"url": "https://www.linkedin.com/feed/update/urn:li:activity:7123456789012345678",
"date_published": "2026-01-20T08:00:00+00:00",
"image": "https://media.licdn.com/example.jpg",
"topics": [
"hiring",
"engineering"
],
"more_articles": [],
"article_body": "We shipped the new dashboard today...",
"like_count": 1062,
"comment_count": 72,
"is_truncated": true,
"canonical_url": "https://www.linkedin.com/feed/update/urn:li:activity:7123456789012345678",
"author": {
"name": "John Doe",
"url": "https://www.linkedin.com/in/john-doe",
"image": null,
"followers": 0
},
"comments": [
{
"author": "Jane Smith",
"text": "Great post!",
"date_published": "2024-01-15T11:00:00+00:00",
"like_count": 9
}
]
}
Errors
Handle these documented responses before retrying or showing customer-facing failures.
Validation Error
Neither url nor activity_id was provided, or activity_id was not numeric.
{
"success": false,
"message": "Provide either a LinkedIn post URL or a numeric activity_id.",
"status_code": 422,
"error_code": "linkedin_transcript_invalid_activity_id"
}Not Publicly Accessible
LinkedIn answered with a sign-in wall instead of the post. The post is not publicly accessible. Not billed.
{
"success": false,
"message": "This post is not publicly accessible.",
"status_code": 403,
"error_code": "linkedin_transcript_auth_wall"
}Post Not Found
The activity ID does not exist, or the post is not reachable at that URL. Not billed. Distinct from linkedin_transcript_empty_payload below, which means LinkedIn answered 200 with a page carrying no post data.
{
"success": false,
"message": "Post not found or not publicly accessible",
"status_code": 404,
"error_code": "linkedin_post_not_found"
}No Post Data
The activity ID does not exist, or LinkedIn returned a page carrying no post data. Not billed.
{
"success": false,
"message": "LinkedIn returned no post data for this activity.",
"status_code": 404,
"error_code": "linkedin_transcript_empty_payload"
}LinkedIn Temporarily Unavailable
The upstream service is temporarily unavailable. Please retry shortly.
{
"success": false,
"message": "LinkedIn transcript scraping is temporarily unavailable. Please try again.",
"status_code": 503,
"error_code": "upstream_unavailable"
}Request Not Dispatched
Scrappa could not send this request to LinkedIn at all, so no data was retrieved. Please try again in a moment. Failed requests are never billed.
{
"success": false,
"message": "LinkedIn transcript scraping is temporarily unavailable. Please try again.",
"status_code": 503,
"error_code": "upstream_unavailable"
}Upstream Error
LinkedIn answered with a non-success status that is neither a sign-in wall nor a missing post. Failed requests are never billed.
{
"success": false,
"message": "LinkedIn transcript scraping is temporarily unavailable. Please try again.",
"status_code": 503,
"error_code": "linkedin_transcript_upstream_error"
}Upstream Route Changed
LinkedIn no longer serves the route this post is fetched from, so the post cannot be fetched at all. Not billed, and not reported as "post not found" because that would be untrue about your data.
{
"success": false,
"message": "LinkedIn changed this endpoint and the post could not be fetched.",
"status_code": 503,
"error_code": "linkedin_transcript_upstream_drift"
}Generate Code with AI
Copy a ready-made prompt with all the endpoint details, parameters, and example responses. Paste it into ChatGPT, Claude, or any AI assistant to instantly generate working code.
Related LinkedIn API docs
LinkedIn Profile API
Get public profile identity, headline, experience, education, skills, activity, and similar profiles.
LinkedIn Company API
Enrich profile and recruiting workflows with company page details and metadata.
LinkedIn API overview
Browse profile, company, search, jobs, job details, and post endpoints from one hub.
Try It Live
Test this endpoint in our interactive playground with real data.