Skip to content
Scrappa Get API key
LinkedIn API 1 credit/request

LinkedIn Post Transcript

GET https://scrappa.co/api/linkedin/post/transcript?activity_id=7123456789012345678

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.

LinkedIn Post Transcript 1 credit/request

Endpoint

Request preview
GET
https://scrappa.co/api/linkedin/post/transcript?activity_id=7123456789012345678
Auth header
x-api-key
Cost
1 credit/request
Response preview
200 OK
{
    "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": [],
...

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.

url string Optional
Open example

LinkedIn post URL. Provide this or activity_id. A /feed/update/urn:li:share: URL is fetched as the share URN it names; a share URN and an activity URN are different resources behind the same number, so the URN type is read from the URL path. The path is the only source of the id and the URN type: no query parameter can supply or override either, so a tracking parameter carrying another URN is ignored.

Example value https://example.com/product
activity_id 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.

Example value 7123456789012345678

Request Examples

PHP
<?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
<?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();
}
JavaScript
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));
JavaScript
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);
}
Ruby
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
Python
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()
Python
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}")
Java
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());
        }
    }
}
Go
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))
}
Terminal
#!/bin/bash

curl -X GET \
    -H "x-api-key: YOUR_API_KEY_HERE" \
    "https://scrappa.co/api/linkedin/post/transcript?activity_id=7123456789012345678"
C#
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}");
        }
    }
}
TypeScript
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();
RUST
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
JSON Response
200 OK
{
    "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.

422

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"
}
403

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"
}
404

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"
}
404

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"
}
503

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"
}
503

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"
}
503

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"
}
503

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

Try It Live

Test this endpoint in our interactive playground with real data.