curl --request GET \
--url https://api.fetchin.io/api/v1/company/posts \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.fetchin.io/api/v1/company/posts"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.fetchin.io/api/v1/company/posts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fetchin.io/api/v1/company/posts",
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: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.fetchin.io/api/v1/company/posts"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.fetchin.io/api/v1/company/posts")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fetchin.io/api/v1/company/posts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"posts": [
{
"id": "urn:li:activity:7488411205392719872",
"shareUrn": "urn:li:ugcPost:7488411204611784704",
"content": "Agents are changing how teams build. Here is what our engineers learned shipping them to production...",
"date": "2026-07-30T15:02:11.418Z",
"reactionCount": 3182,
"commentCount": 212,
"sharesCount": 184,
"reactionsByType": {
"like": 2744,
"praise": 219,
"interest": 141,
"empathy": 78
},
"postType": "image",
"shareUrl": "https://www.linkedin.com/posts/microsoft_agents-are-changing-...",
"imageUrl": "https://media.licdn.com/dms/image/...",
"videoUrl": null,
"carouselPdfUrl": null,
"images": [
{
"url": "https://media.licdn.com/dms/image/...",
"width": 1920,
"height": 1080
}
],
"video": null,
"authorType": "Company",
"profile": {
"urn": "urn:li:fsd_organizationalPage:1035",
"name": "Microsoft",
"headline": "Empowering every person and every organization on the planet to achieve more.",
"url": "https://www.linkedin.com/company/microsoft",
"imageUrl": "https://media.licdn.com/dms/image/..."
},
"permissions": {
"canReact": true,
"canPostComments": true,
"canShare": true,
"commentingDisabled": false,
"allowedCommentersScope": "ALL",
"shareAudience": "PUBLIC",
"isActivity": false,
"rootShare": true
}
},
{
"id": "urn:li:activity:7485109887654321664",
"shareUrn": "urn:li:share:7485109886654321665",
"content": "",
"date": "2026-07-21T09:45:03.117Z",
"reactionCount": 946,
"commentCount": 57,
"sharesCount": 33,
"reactionsByType": {
"like": 848,
"praise": 61,
"empathy": 37
},
"postType": "document",
"shareUrl": "https://www.linkedin.com/posts/microsoft_...",
"imageUrl": null,
"videoUrl": null,
"carouselPdfUrl": "https://media.licdn.com/dms/document/...",
"images": [],
"video": null,
"authorType": "Company",
"profile": {
"urn": "urn:li:fsd_organizationalPage:1035",
"name": "Microsoft",
"headline": "Empowering every person and every organization on the planet to achieve more.",
"url": "https://www.linkedin.com/company/microsoft",
"imageUrl": "https://media.licdn.com/dms/image/..."
},
"permissions": {
"canReact": true,
"canPostComments": true,
"canShare": true,
"commentingDisabled": false,
"allowedCommentersScope": "ALL",
"shareAudience": "PUBLIC",
"isActivity": false,
"rootShare": true
}
}
],
"paginationToken": "dXJuOmxpOmFjdGl2aXR5Ojc0ODUxMDk4ODc2NTQzMjE2NjQ=",
"hasMore": true,
"pageSize": 5
}
{
"error": "Missing companyUrlOrUrn parameter",
"code": "MISSING_PARAMETER"
}
{
"error": "Expected a company page, not a member profile.",
"code": "INVALID_PARAMETER"
}
{
"error": "Invalid API key",
"code": "INVALID_API_KEY"
}
{
"error": "Unable to find company data from slug",
"code": "COMPANY_NOT_FOUND"
}
{
"error": "Quota exceeded. Upgrade your plan or wait for renewal.",
"code": "QUOTA_EXHAUSTED",
"details": {
"creditsRemaining": 0,
"subscriptionCreditsRemaining": 0,
"paygCreditsRemaining": 0,
"buyCreditsUrl": "https://fetchin.io/credits"
}
}
{
"error": "Internal server error",
"code": "INTERNAL_ERROR"
}
{
"error": "Service temporarily unable to serve this request. Please retry.",
"code": "SERVICE_UNAVAILABLE"
}
Get Company Posts
Fetch the posts published by a company page with engagement metrics
curl --request GET \
--url https://api.fetchin.io/api/v1/company/posts \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.fetchin.io/api/v1/company/posts"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.fetchin.io/api/v1/company/posts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fetchin.io/api/v1/company/posts",
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: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.fetchin.io/api/v1/company/posts"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.fetchin.io/api/v1/company/posts")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fetchin.io/api/v1/company/posts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"posts": [
{
"id": "urn:li:activity:7488411205392719872",
"shareUrn": "urn:li:ugcPost:7488411204611784704",
"content": "Agents are changing how teams build. Here is what our engineers learned shipping them to production...",
"date": "2026-07-30T15:02:11.418Z",
"reactionCount": 3182,
"commentCount": 212,
"sharesCount": 184,
"reactionsByType": {
"like": 2744,
"praise": 219,
"interest": 141,
"empathy": 78
},
"postType": "image",
"shareUrl": "https://www.linkedin.com/posts/microsoft_agents-are-changing-...",
"imageUrl": "https://media.licdn.com/dms/image/...",
"videoUrl": null,
"carouselPdfUrl": null,
"images": [
{
"url": "https://media.licdn.com/dms/image/...",
"width": 1920,
"height": 1080
}
],
"video": null,
"authorType": "Company",
"profile": {
"urn": "urn:li:fsd_organizationalPage:1035",
"name": "Microsoft",
"headline": "Empowering every person and every organization on the planet to achieve more.",
"url": "https://www.linkedin.com/company/microsoft",
"imageUrl": "https://media.licdn.com/dms/image/..."
},
"permissions": {
"canReact": true,
"canPostComments": true,
"canShare": true,
"commentingDisabled": false,
"allowedCommentersScope": "ALL",
"shareAudience": "PUBLIC",
"isActivity": false,
"rootShare": true
}
},
{
"id": "urn:li:activity:7485109887654321664",
"shareUrn": "urn:li:share:7485109886654321665",
"content": "",
"date": "2026-07-21T09:45:03.117Z",
"reactionCount": 946,
"commentCount": 57,
"sharesCount": 33,
"reactionsByType": {
"like": 848,
"praise": 61,
"empathy": 37
},
"postType": "document",
"shareUrl": "https://www.linkedin.com/posts/microsoft_...",
"imageUrl": null,
"videoUrl": null,
"carouselPdfUrl": "https://media.licdn.com/dms/document/...",
"images": [],
"video": null,
"authorType": "Company",
"profile": {
"urn": "urn:li:fsd_organizationalPage:1035",
"name": "Microsoft",
"headline": "Empowering every person and every organization on the planet to achieve more.",
"url": "https://www.linkedin.com/company/microsoft",
"imageUrl": "https://media.licdn.com/dms/image/..."
},
"permissions": {
"canReact": true,
"canPostComments": true,
"canShare": true,
"commentingDisabled": false,
"allowedCommentersScope": "ALL",
"shareAudience": "PUBLIC",
"isActivity": false,
"rootShare": true
}
}
],
"paginationToken": "dXJuOmxpOmFjdGl2aXR5Ojc0ODUxMDk4ODc2NTQzMjE2NjQ=",
"hasMore": true,
"pageSize": 5
}
{
"error": "Missing companyUrlOrUrn parameter",
"code": "MISSING_PARAMETER"
}
{
"error": "Expected a company page, not a member profile.",
"code": "INVALID_PARAMETER"
}
{
"error": "Invalid API key",
"code": "INVALID_API_KEY"
}
{
"error": "Unable to find company data from slug",
"code": "COMPANY_NOT_FOUND"
}
{
"error": "Quota exceeded. Upgrade your plan or wait for renewal.",
"code": "QUOTA_EXHAUSTED",
"details": {
"creditsRemaining": 0,
"subscriptionCreditsRemaining": 0,
"paygCreditsRemaining": 0,
"buyCreditsUrl": "https://fetchin.io/credits"
}
}
{
"error": "Internal server error",
"code": "INTERNAL_ERROR"
}
{
"error": "Service temporarily unable to serve this request. Please retry.",
"code": "SERVICE_UNAVAILABLE"
}
Endpoint
GET /api/v1/company/posts
Authentication
Include your API key in the request header:X-API-Key: your-api-key-here
Parameters
- Company page URL. Example:
https://www.linkedin.com/company/microsoft(a trailing slash makes no difference) - Public identifier (slug), also fine. Example:
microsoft - Organization URN. Example:
urn:li:fsd_organizationalPage:1035
/company/<slug>). Either form works — the bare slug or the company/<slug> fragment.Member profile inputs (a /in/<slug> URL or a urn:li:fsd_profile:…) are rejected with a 400 INVALID_PARAMETER — “Expected a company page, not a member profile.” — free of charge. Use Get Posts for people.companyUrlOrUrn wins.- Minimum: 1 —
0or a negative value is rejected with400 - Maximum: 100 — a higher value is clamped, not rejected
- Default: 10
start is rejected with 400 rather than silently
returning the first page again. Use paginationToken.paginationToken from the previous
response, unchanged; omit it to start from the beginning. A value this API did
not issue is rejected with 400. Keep paging while hasMore is true.Response
GET /api/v1/posts — see
Get Posts for the full field list
(id, shareUrn, content, date, reactionCount, commentCount,
sharesCount, reactionsByType, images, video, shareUrl,
permissions, …), so you can reuse the same types in your client code.The fields that matter most on a company feed:Show Post object (company feed essentials)
Show Post object (company feed essentials)
urn:li:activity:...)."Company" on this endpoint — the author is an organization page,
not a member.paginationToken to fetch the next page. Do not read
its presence as “there is more”: decide on hasMore, which is the only
end-of-feed signal on this endpoint.true — see Pagination.posts.length to tell the two quiet
cases apart: a small pageSize means the feed itself ran short, while a full
pageSize with few posts means this page was mostly filtered rows and it is
worth asking for the next one.Example Request
curl -X GET "https://api.fetchin.io/api/v1/company/posts?companyUrlOrUrn=https://www.linkedin.com/company/microsoft&count=5" \
-H "X-API-Key: your-api-key-here"
const response = await fetch(
'https://api.fetchin.io/api/v1/company/posts?companyUrlOrUrn=https://www.linkedin.com/company/microsoft&count=5',
{
headers: {
'X-API-Key': 'your-api-key-here'
}
}
);
const data = await response.json();
console.log(data.posts);
import requests
headers = {
'X-API-Key': 'your-api-key-here'
}
params = {
'companyUrlOrUrn': 'https://www.linkedin.com/company/microsoft',
'count': 5
}
response = requests.get(
'https://api.fetchin.io/api/v1/company/posts',
headers=headers,
params=params
)
data = response.json()
print(data['posts'])
<?php
$apiKey = 'your-api-key-here';
$companyUrl = 'https://www.linkedin.com/company/microsoft';
$count = 5;
$url = "https://api.fetchin.io/api/v1/company/posts?companyUrlOrUrn=" . urlencode($companyUrl) . "&count=" . $count;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'X-API-Key: ' . $apiKey
]);
$response = curl_exec($ch);
$data = json_decode($response, true);
curl_close($ch);
print_r($data['posts']);
?>
Example Response
Posts come back in a page object, not a bare array.{
"posts": [
{
"id": "urn:li:activity:7488411205392719872",
"shareUrn": "urn:li:ugcPost:7488411204611784704",
"content": "Agents are changing how teams build. Here is what our engineers learned shipping them to production...",
"date": "2026-07-30T15:02:11.418Z",
"reactionCount": 3182,
"commentCount": 212,
"sharesCount": 184,
"reactionsByType": {
"like": 2744,
"praise": 219,
"interest": 141,
"empathy": 78
},
"postType": "image",
"shareUrl": "https://www.linkedin.com/posts/microsoft_agents-are-changing-...",
"imageUrl": "https://media.licdn.com/dms/image/...",
"videoUrl": null,
"carouselPdfUrl": null,
"images": [
{
"url": "https://media.licdn.com/dms/image/...",
"width": 1920,
"height": 1080
}
],
"video": null,
"authorType": "Company",
"profile": {
"urn": "urn:li:fsd_organizationalPage:1035",
"name": "Microsoft",
"headline": "Empowering every person and every organization on the planet to achieve more.",
"url": "https://www.linkedin.com/company/microsoft",
"imageUrl": "https://media.licdn.com/dms/image/..."
},
"permissions": {
"canReact": true,
"canPostComments": true,
"canShare": true,
"commentingDisabled": false,
"allowedCommentersScope": "ALL",
"shareAudience": "PUBLIC",
"isActivity": false,
"rootShare": true
}
},
{
"id": "urn:li:activity:7485109887654321664",
"shareUrn": "urn:li:share:7485109886654321665",
"content": "",
"date": "2026-07-21T09:45:03.117Z",
"reactionCount": 946,
"commentCount": 57,
"sharesCount": 33,
"reactionsByType": {
"like": 848,
"praise": 61,
"empathy": 37
},
"postType": "document",
"shareUrl": "https://www.linkedin.com/posts/microsoft_...",
"imageUrl": null,
"videoUrl": null,
"carouselPdfUrl": "https://media.licdn.com/dms/document/...",
"images": [],
"video": null,
"authorType": "Company",
"profile": {
"urn": "urn:li:fsd_organizationalPage:1035",
"name": "Microsoft",
"headline": "Empowering every person and every organization on the planet to achieve more.",
"url": "https://www.linkedin.com/company/microsoft",
"imageUrl": "https://media.licdn.com/dms/image/..."
},
"permissions": {
"canReact": true,
"canPostComments": true,
"canShare": true,
"commentingDisabled": false,
"allowedCommentersScope": "ALL",
"shareAudience": "PUBLIC",
"isActivity": false,
"rootShare": true
}
}
],
"paginationToken": "dXJuOmxpOmFjdGl2aXR5Ojc0ODUxMDk4ODc2NTQzMjE2NjQ=",
"hasMore": true,
"pageSize": 5
}
{
"error": "Missing companyUrlOrUrn parameter",
"code": "MISSING_PARAMETER"
}
{
"error": "Expected a company page, not a member profile.",
"code": "INVALID_PARAMETER"
}
{
"error": "Invalid API key",
"code": "INVALID_API_KEY"
}
{
"error": "Unable to find company data from slug",
"code": "COMPANY_NOT_FOUND"
}
{
"error": "Quota exceeded. Upgrade your plan or wait for renewal.",
"code": "QUOTA_EXHAUSTED",
"details": {
"creditsRemaining": 0,
"subscriptionCreditsRemaining": 0,
"paygCreditsRemaining": 0,
"buyCreditsUrl": "https://fetchin.io/credits"
}
}
{
"error": "Internal server error",
"code": "INTERNAL_ERROR"
}
{
"error": "Service temporarily unable to serve this request. Please retry.",
"code": "SERVICE_UNAVAILABLE"
}
Errors
See Error Handling for the full list of error codes and recommended handling.400MISSING_PARAMETER/INVALID_PARAMETER/INVALID_URN401INVALID_API_KEY404COMPANY_NOT_FOUND402QUOTA_EXHAUSTED429RATE_LIMITED500INTERNAL_ERROR503SERVICE_UNAVAILABLE
Pagination
To walk a company’s whole feed:- Make an initial request without
paginationToken - If
hasMoreistrue, pass the returnedpaginationTokeninto your next request, unchanged - Continue until
hasMoreisfalse
async function fetchAllCompanyPosts(companyUrlOrUrn) {
const allPosts = [];
let paginationToken = null;
let hasMore = true;
while (hasMore) {
const params = new URLSearchParams({
companyUrlOrUrn,
count: '50'
});
if (paginationToken) {
params.set('paginationToken', paginationToken);
}
const response = await fetch(
`https://api.fetchin.io/api/v1/company/posts?${params}`,
{ headers: { 'X-API-Key': 'your-api-key-here' } }
);
const data = await response.json();
allPosts.push(...data.posts);
paginationToken = data.paginationToken;
hasMore = data.hasMore;
}
return allPosts;
}
Notes
count parameter value. Errors are free — with one exception: a 404 not found costs 1 credit. See Quotas.count is a ceiling, not a promise: the feed
also carries reposts, which are filtered out of posts, so a page can hold
fewer posts than you asked for while more still remain. A short page is not
the end of the feed — keep paging while hasMore is true.Use Cases
Competitor monitoring
Account signals
Content benchmarking
Brand archive
Authorizations
Query Parameters
The company / organization whose posts to fetch. Accepts a company page URL (example https://www.linkedin.com/company/microsoft; a trailing slash is ignored), a public identifier/slug on its own (also fine; example microsoft), or an organization URN (example urn:li:fsd_organizationalPage:1035). The slug is the last path segment of a company page URL, so pass just the slug, not the /company/ prefix. A member profile input (a /in/<slug> URL or a urn:li:fsd_profile:...) is rejected with a free 400 INVALID_PARAMETER - "Expected a company page, not a member profile." - use GET /api/v1/posts for people.
"microsoft"
Accepted as an alternative name for companyUrlOrUrn, because GET /api/v1/posts has always taken company pages under it. Pass either name; when both are given, companyUrlOrUrn wins.
"https://www.linkedin.com/company/microsoft"
Number of posts to fetch per page (default: 10). A higher value is clamped to 100.
1 <= x <= 100Not supported on this endpoint. This feed is cursor-paginated and ignores offsets, so a non-zero value is rejected with 400 rather than silently returning the first page again. Page with paginationToken instead.
x >= 0Cursor for the next page: pass back the paginationToken from the previous response, unchanged. Omit it to start from the beginning. A value this API did not issue is rejected with 400. Keep paging while hasMore is true.
Response
Successfully fetched the company page's posts
Posts on this page, newest first. Same item shape as GET /api/v1/posts. Reposts are filtered out, so a page can hold fewer items than count while more remain - trust hasMore.
Show child attributes
Show child attributes
Cursor to pass back as paginationToken to fetch the next page. Only present when more posts are available.
"dXJuOmxpOmFjdGl2aXR5Ojc0ODUxMDk4ODc2NTQzMjE2NjQ="
Whether the feed holds more posts behind this page. Keep paging while true.
How many rows the feed returned for this page before reposts were filtered out of posts. Compare it with the length of posts to tell a feed that ran short from a page that happened to be mostly reposts.
5