curl --request GET \
--url https://api.fetchin.io/api/v1/profile/reactions \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.fetchin.io/api/v1/profile/reactions"
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/profile/reactions', 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/profile/reactions",
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/profile/reactions"
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/profile/reactions")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fetchin.io/api/v1/profile/reactions")
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{
"reactions": [
{
"reactionType": "LIKE",
"post": {
"id": "urn:li:activity:7422911506511486976",
"content": "One annoying discovery I made when I started selling Borumi is that refunds are not free...",
"date": "2025-02-01T10:30:00Z",
"reactionCount": 25,
"commentCount": 11,
"imageUrl": "https://media.licdn.com/dms/image/...",
"videoUrl": null,
"carouselPdfUrl": null,
"profile": {
"urn": "urn:li:fsd_profile:ACoAACHFUsoBILf",
"name": "Federico Terzi",
"headline": "Founder @ Borumi.com",
"url": "https://www.linkedin.com/in/federico-terzi",
"imageUrl": "https://media.licdn.com/dms/image/..."
}
}
},
{
"reactionType": "EMPATHY",
"post": {
"id": "urn:li:activity:7409540219328344064",
"content": "At 30, Thibaud Elziere was selling his company for 800M to Adobe...",
"date": "2025-01-20T14:20:00Z",
"reactionCount": 635,
"commentCount": 59,
"imageUrl": null,
"videoUrl": null,
"carouselPdfUrl": null,
"profile": {
"urn": "urn:li:fsd_profile:ACoAADGS3aIB50y",
"name": "Guillaume Moubeche",
"headline": "Founder @ lemlist",
"url": "https://www.linkedin.com/in/guillaume-moubeche-a026541b2",
"imageUrl": "https://media.licdn.com/dms/image/..."
}
}
},
{
"reactionType": "ENTERTAINMENT",
"post": {
"id": "urn:li:activity:7402610232759058433",
"content": "Friday Developers Fun. Explain to me Tech debt as I'm 5.",
"date": "2025-01-05T09:00:00Z",
"reactionCount": 4084,
"commentCount": 78,
"imageUrl": "https://media.licdn.com/dms/image/...",
"videoUrl": null,
"carouselPdfUrl": null,
"profile": {
"urn": "urn:li:fsd_profile:ACoAAAC60lcBKfZ",
"name": "Dr Milan Milanovic",
"headline": "Helping 400K+ engineers and leaders grow",
"url": "https://www.linkedin.com/in/milanmilanovic",
"imageUrl": "https://media.licdn.com/dms/image/..."
}
}
}
],
"paginationToken": "dXJuOmxpOmFjdGl2aXR5Ojc0MDI5Njk4NzAyODU1NjU5NTItMTc2NTAwNTU1NzUzOA==",
"hasMore": true
}
{
"error": "Missing profileUrlOrUrn parameter",
"code": "MISSING_PARAMETER"
}
{
"error": "Invalid API key",
"code": "INVALID_API_KEY"
}
{
"error": "LinkedIn profile not found",
"code": "PROFILE_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 Profile Reactions
Fetch posts that a professional profile has reacted to
curl --request GET \
--url https://api.fetchin.io/api/v1/profile/reactions \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.fetchin.io/api/v1/profile/reactions"
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/profile/reactions', 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/profile/reactions",
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/profile/reactions"
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/profile/reactions")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fetchin.io/api/v1/profile/reactions")
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{
"reactions": [
{
"reactionType": "LIKE",
"post": {
"id": "urn:li:activity:7422911506511486976",
"content": "One annoying discovery I made when I started selling Borumi is that refunds are not free...",
"date": "2025-02-01T10:30:00Z",
"reactionCount": 25,
"commentCount": 11,
"imageUrl": "https://media.licdn.com/dms/image/...",
"videoUrl": null,
"carouselPdfUrl": null,
"profile": {
"urn": "urn:li:fsd_profile:ACoAACHFUsoBILf",
"name": "Federico Terzi",
"headline": "Founder @ Borumi.com",
"url": "https://www.linkedin.com/in/federico-terzi",
"imageUrl": "https://media.licdn.com/dms/image/..."
}
}
},
{
"reactionType": "EMPATHY",
"post": {
"id": "urn:li:activity:7409540219328344064",
"content": "At 30, Thibaud Elziere was selling his company for 800M to Adobe...",
"date": "2025-01-20T14:20:00Z",
"reactionCount": 635,
"commentCount": 59,
"imageUrl": null,
"videoUrl": null,
"carouselPdfUrl": null,
"profile": {
"urn": "urn:li:fsd_profile:ACoAADGS3aIB50y",
"name": "Guillaume Moubeche",
"headline": "Founder @ lemlist",
"url": "https://www.linkedin.com/in/guillaume-moubeche-a026541b2",
"imageUrl": "https://media.licdn.com/dms/image/..."
}
}
},
{
"reactionType": "ENTERTAINMENT",
"post": {
"id": "urn:li:activity:7402610232759058433",
"content": "Friday Developers Fun. Explain to me Tech debt as I'm 5.",
"date": "2025-01-05T09:00:00Z",
"reactionCount": 4084,
"commentCount": 78,
"imageUrl": "https://media.licdn.com/dms/image/...",
"videoUrl": null,
"carouselPdfUrl": null,
"profile": {
"urn": "urn:li:fsd_profile:ACoAAAC60lcBKfZ",
"name": "Dr Milan Milanovic",
"headline": "Helping 400K+ engineers and leaders grow",
"url": "https://www.linkedin.com/in/milanmilanovic",
"imageUrl": "https://media.licdn.com/dms/image/..."
}
}
}
],
"paginationToken": "dXJuOmxpOmFjdGl2aXR5Ojc0MDI5Njk4NzAyODU1NjU5NTItMTc2NTAwNTU1NzUzOA==",
"hasMore": true
}
{
"error": "Missing profileUrlOrUrn parameter",
"code": "MISSING_PARAMETER"
}
{
"error": "Invalid API key",
"code": "INVALID_API_KEY"
}
{
"error": "LinkedIn profile not found",
"code": "PROFILE_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/profile/reactions
Authentication
Include your API key in the request header:X-API-Key: your-api-key-here
Parameters
- Profile URN, recommended for consistency: a profile’s public identifier (slug) can change over time, the URN does not. Example:
urn:li:fsd_profile:ACoAAA8BYqEBCGLg_vT_ca6mMEqkpp9nVffJ3hc - Public identifier (slug), also fine. Example:
williamhgates - Profile URL. Example:
https://www.linkedin.com/in/williamhgates(a trailing slash makes no difference)
linkedin.com/in/<slug>). Pass just the slug, not the /in/ prefix.- Minimum: 1
- Maximum: 50
- 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
Show Reaction object
Show Reaction object
LIKE, EMPATHY (Love), ENTERTAINMENT (Funny), INTEREST (Insightful), PRAISE (Celebrate), APPRECIATION (Support).GET /api/v1/posts.Show Post object
Show Post object
Example Request
curl -X GET "https://api.fetchin.io/api/v1/profile/reactions?profileUrlOrUrn=https://www.linkedin.com/in/williamhgates&count=5" \
-H "X-API-Key: your-api-key-here"
const response = await fetch(
'https://api.fetchin.io/api/v1/profile/reactions?profileUrlOrUrn=https://www.linkedin.com/in/williamhgates&count=5',
{
headers: {
'X-API-Key': 'your-api-key-here'
}
}
);
const data = await response.json();
console.log(data.reactions);
import requests
headers = {
'X-API-Key': 'your-api-key-here'
}
params = {
'profileUrlOrUrn': 'https://www.linkedin.com/in/williamhgates',
'count': 5
}
response = requests.get(
'https://api.fetchin.io/api/v1/profile/reactions',
headers=headers,
params=params
)
data = response.json()
print(data['reactions'])
<?php
$apiKey = 'your-api-key-here';
$profileUrl = 'https://www.linkedin.com/in/williamhgates';
$count = 5;
$url = "https://api.fetchin.io/api/v1/profile/reactions?profileUrlOrUrn=" . urlencode($profileUrl) . "&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['reactions']);
?>
Example Response
{
"reactions": [
{
"reactionType": "LIKE",
"post": {
"id": "urn:li:activity:7422911506511486976",
"content": "One annoying discovery I made when I started selling Borumi is that refunds are not free...",
"date": "2025-02-01T10:30:00Z",
"reactionCount": 25,
"commentCount": 11,
"imageUrl": "https://media.licdn.com/dms/image/...",
"videoUrl": null,
"carouselPdfUrl": null,
"profile": {
"urn": "urn:li:fsd_profile:ACoAACHFUsoBILf",
"name": "Federico Terzi",
"headline": "Founder @ Borumi.com",
"url": "https://www.linkedin.com/in/federico-terzi",
"imageUrl": "https://media.licdn.com/dms/image/..."
}
}
},
{
"reactionType": "EMPATHY",
"post": {
"id": "urn:li:activity:7409540219328344064",
"content": "At 30, Thibaud Elziere was selling his company for 800M to Adobe...",
"date": "2025-01-20T14:20:00Z",
"reactionCount": 635,
"commentCount": 59,
"imageUrl": null,
"videoUrl": null,
"carouselPdfUrl": null,
"profile": {
"urn": "urn:li:fsd_profile:ACoAADGS3aIB50y",
"name": "Guillaume Moubeche",
"headline": "Founder @ lemlist",
"url": "https://www.linkedin.com/in/guillaume-moubeche-a026541b2",
"imageUrl": "https://media.licdn.com/dms/image/..."
}
}
},
{
"reactionType": "ENTERTAINMENT",
"post": {
"id": "urn:li:activity:7402610232759058433",
"content": "Friday Developers Fun. Explain to me Tech debt as I'm 5.",
"date": "2025-01-05T09:00:00Z",
"reactionCount": 4084,
"commentCount": 78,
"imageUrl": "https://media.licdn.com/dms/image/...",
"videoUrl": null,
"carouselPdfUrl": null,
"profile": {
"urn": "urn:li:fsd_profile:ACoAAAC60lcBKfZ",
"name": "Dr Milan Milanovic",
"headline": "Helping 400K+ engineers and leaders grow",
"url": "https://www.linkedin.com/in/milanmilanovic",
"imageUrl": "https://media.licdn.com/dms/image/..."
}
}
}
],
"paginationToken": "dXJuOmxpOmFjdGl2aXR5Ojc0MDI5Njk4NzAyODU1NjU5NTItMTc2NTAwNTU1NzUzOA==",
"hasMore": true
}
{
"error": "Missing profileUrlOrUrn parameter",
"code": "MISSING_PARAMETER"
}
{
"error": "Invalid API key",
"code": "INVALID_API_KEY"
}
{
"error": "LinkedIn profile not found",
"code": "PROFILE_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_URN401INVALID_API_KEY404PROFILE_NOT_FOUND402QUOTA_EXHAUSTED429RATE_LIMITED500INTERNAL_ERROR503SERVICE_UNAVAILABLE
Pagination
To fetch all reactions from a profile, use pagination:- Make an initial request without
paginationToken - If
hasMoreistrue, use the returnedpaginationTokenin your next request - Continue until
hasMoreisfalse
async function fetchAllReactions(profileUrl) {
const allReactions = [];
let paginationToken = null;
let hasMore = true;
while (hasMore) {
const params = new URLSearchParams({
profileUrlOrUrn: profileUrl,
count: '20'
});
if (paginationToken) {
params.set('paginationToken', paginationToken);
}
const response = await fetch(
`https://api.fetchin.io/api/v1/profile/reactions?${params}`,
{ headers: { 'X-API-Key': 'your-api-key-here' } }
);
const data = await response.json();
allReactions.push(...data.reactions);
paginationToken = data.paginationToken;
hasMore = data.hasMore;
}
return allReactions;
}
Reaction Types
| Value | Platform Label | Description |
|---|---|---|
LIKE | Like | Standard like reaction |
EMPATHY | Love | Heart/love reaction |
ENTERTAINMENT | Funny | Laughing face reaction |
INTEREST | Insightful | Lightbulb/insightful reaction |
PRAISE | Celebrate | Clapping/celebrate reaction |
APPRECIATION | Support | Hands/support reaction |
Notes
count parameter value. Errors are free — with one exception: a 404 not found costs 1 credit. See Quotas.post object within each reaction has the same shape as items from GET /api/v1/posts, so you can reuse the same types in your client code.paginationToken to efficiently paginate through a profile’s reaction history without re-fetching already retrieved reactions.Use Cases
Competitive intelligence
Interest analysis
Content research
Lead scoring
Authorizations
Query Parameters
The professional profile to fetch. Accepts a profile URN (recommended for consistency, since a profile's public identifier can change over time while the URN does not; example urn:li:fsd_profile:ACoAAA8BYqEBCGLg_vT_ca6mMEqkpp9nVffJ3hc), a public identifier/slug (also fine; example williamhgates), or a full profile URL (example https://www.linkedin.com/in/williamhgates; a trailing slash is ignored). The slug is the last path segment of a profile URL, so pass just the slug, not the /in/ prefix.
"urn:li:fsd_profile:ACoAAA8BYqEBCGLg_vT_ca6mMEqkpp9nVffJ3hc"
Number of reactions to fetch (default: 10)
1 <= x <= 50Not 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.