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

LinkedIn Company Posts

GET https://scrappa.co/api/linkedin/company/posts?slug=microsoft

Get a company's public posts with titles, dates, engagement and numeric activity IDs, from the company's public landing page. LinkedIn does not serve the full posts feed to anonymous requests, so this is the public landing-page harvest and the response always labels it with source: company_landing_page. post_count is what the landing page carried. is_truncated is always true, not a measurement: the landing page only ever renders a preview subset, and the full feed is unreachable for anonymous requests on every path rather than under any particular condition. upstream_calls reports the number of real upstream requests made; it exceeds 1 only when a request was refused and retried, which is not a fan-out and not an extra charge. No post is fetched in detail here — use the LinkedIn Post Transcript endpoint for a single post's comments. 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 Company Posts 1 credit/request

Endpoint

Request preview
GET
https://scrappa.co/api/linkedin/company/posts?slug=microsoft
Auth header
x-api-key
Cost
1 credit/request
slug = microsoft
Response preview
200 OK
{
    "success": true,
    "source": "company_landing_page",
    "company": {
        "name": "Microsoft",
        "slug": "microsoft",
        "url": "https://www.linkedin.com/company/microsoft/",
        "logo": null
    },
    "posts": [
        {
            "title": "Our FY26 Q2 results",
            "url": "https://www.linkedin.com/posts/microsoft_our-fy26-q2-results-activity-7123456789012345678",
            "activity_id": "7123456789012345678",
...

Parameters

Start with the required fields, then add optional filters only when your use case needs them.

Runnable path

1 required parameter needed before sending a request.

slug string Required

LinkedIn company slug, e.g. tesla-motors. Use the slug, not the brand name: /company/tesla/ does not exist while /company/tesla-motors/ does.

Example value microsoft

Request Examples

PHP
<?php

$curl = curl_init();

curl_setopt_array($curl, [
    CURLOPT_URL => "https://scrappa.co/api/linkedin/company/posts?slug=microsoft",
    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/company/posts?slug=microsoft');

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/company/posts?slug=microsoft', 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/company/posts?slug=microsoft',
    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/company/posts?slug=microsoft")
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/company/posts?slug=microsoft", 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/company/posts?slug=microsoft', 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/company/posts?slug=microsoft")
        .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/company/posts?slug=microsoft", 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/company/posts?slug=microsoft"
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/company/posts?slug=microsoft"));
            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/company/posts?slug=microsoft',
            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/company/posts?slug=microsoft")
        .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 source company posts post_count is_truncated upstream_calls

Common posts fields

title url activity_id date
JSON Response
200 OK
{
    "success": true,
    "source": "company_landing_page",
    "company": {
        "name": "Microsoft",
        "slug": "microsoft",
        "url": "https://www.linkedin.com/company/microsoft/",
        "logo": null
    },
    "posts": [
        {
            "title": "Our FY26 Q2 results",
            "url": "https://www.linkedin.com/posts/microsoft_our-fy26-q2-results-activity-7123456789012345678",
            "activity_id": "7123456789012345678",
            "date": "2026-01-22T08:00:00+00:00",
            "likes": 1062
        }
    ],
    "post_count": 1,
    "is_truncated": true,
    "upstream_calls": 1
}

Errors

Handle these documented responses before retrying or showing customer-facing failures.

422

Validation Error

The slug parameter is missing or is not a valid company slug.

{
    "message": "The request validation failed",
    "errors": {
        "slug": [
            "The slug field is required."
        ]
    }
}
404

Company Not Found

No public company page matched this slug. Not billed.

{
    "success": false,
    "message": "Company not found",
    "status_code": 404,
    "error_code": "linkedin_company_posts_not_found"
}
422

Invalid Slug

The slug was not a LinkedIn company slug. Rejected before anything was fetched, so nothing was billed.

{
    "success": false,
    "message": "A valid LinkedIn company slug is required.",
    "status_code": 422,
    "error_code": "linkedin_company_slug_invalid"
}
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 company posts are temporarily unavailable. Please try again.",
    "status_code": 503,
    "error_code": "upstream_unavailable"
}
503

LinkedIn Temporarily Unavailable

The request never reached LinkedIn, for example because the connection failed on every attempt. Failed requests are never billed.

{
    "success": false,
    "message": "LinkedIn company posts are temporarily unavailable. Please try again.",
    "status_code": 503,
    "error_code": "linkedin_company_posts_transport_failed"
}
503

LinkedIn Refused The Request

LinkedIn refused the request on every attempt. Retrying usually succeeds. Failed requests are never billed.

{
    "success": false,
    "message": "LinkedIn company posts are temporarily unavailable. Please try again.",
    "status_code": 503,
    "error_code": "linkedin_company_posts_upstream_blocked"
}
503

Upstream Error

LinkedIn answered with a non-success status that is neither a refusal nor a missing company. Failed requests are never billed.

{
    "success": false,
    "message": "LinkedIn company posts are temporarily unavailable.",
    "status_code": 503,
    "error_code": "linkedin_company_posts_upstream_failed"
}
404

No Posts Found

LinkedIn returned a company landing page with no extractable posts. This company may genuinely have nothing public, or the page may have been served without its posts — the two are indistinguishable here, which is how this sub-surface refuses a request. A real answer rather than an outage, and not retried. Not billed.

{
    "success": false,
    "message": "LinkedIn returned a company landing page with no extractable posts.",
    "status_code": 404,
    "error_code": "linkedin_company_posts_empty"
}
502

Upstream Route Changed

LinkedIn no longer serves the route company pages are fetched from, so they cannot be fetched at all. Not billed, and not reported as "company not found" because that would be untrue about your data.

{
    "success": false,
    "message": "LinkedIn\u2019s public company page route is unavailable upstream.",
    "status_code": 502,
    "error_code": "linkedin_company_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.