curl --request GET \
--url https://api.fetchin.io/api/v1/profile/skills/endorsers \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.fetchin.io/api/v1/profile/skills/endorsers"
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/skills/endorsers', 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/skills/endorsers",
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/skills/endorsers"
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/skills/endorsers")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fetchin.io/api/v1/profile/skills/endorsers")
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_bodyGet Profile Skill Endorsers
Fetch every member who endorsed one skill of a professional profile
curl --request GET \
--url https://api.fetchin.io/api/v1/profile/skills/endorsers \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.fetchin.io/api/v1/profile/skills/endorsers"
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/skills/endorsers', 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/skills/endorsers",
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/skills/endorsers"
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/skills/endorsers")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fetchin.io/api/v1/profile/skills/endorsers")
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_bodyEndpoint
GET /api/v1/profile/skills/endorsers
Authentication
Include your API key in the request header:X-API-Key: your-api-key-here
How it works
Each skill on Get Profile and Get Profile Skills carries askillUrn:
{
"name": "Public Speaking",
"skillUrn": "urn:li:fsd_skill:(ACoAAAAteRwB-gns09UDa-RYj02ngoedsj7C9QM,25)"
}
Parameters
- Profile URN. Example:
urn:li:fsd_profile:ACoAAAAteRwB-gns09UDa-RYj02ngoedsj7C9QM - Public identifier (slug). Example:
billcorbettauthor - Profile URL. Example:
https://www.linkedin.com/in/billcorbettauthor(a trailing slash makes no difference)
400 error, free of charge.skills[].skillUrn. Example: urn:li:fsd_skill:(ACoAAAAteRwB-gns09UDa-RYj02ngoedsj7C9QM,25)It must belong to profileUrlOrUrn. A value that is not a skill URN (a skill name, for instance), or a skill of another member when profileUrlOrUrn is a URN, is rejected with a free 400 INVALID_PARAMETER, before anything is fetched.- Minimum: 1 —
0or a negative value is rejected with400 - Maximum: 100 — a higher value is clamped, not rejected
- Default: 100, the most a page holds. A call costs the same whatever the
count.
0 (or omit it) for the first page, then the nextStart the previous response gave you. See Pagination.- Minimum: 0 — a negative value is rejected with
400 - Maximum: 100,000 — a higher value is capped, not rejected
Response
start is past the end of the list.Show Endorser object
Show Endorser object
{ url, width, height }. Absent when they have none. The URLs are signed and expire, so fetch them rather than storing them for months.true when the source has more endorsers after this page. false on the last page.start value to request next. Present only when hasMore is true.Example Request
curl -G "https://api.fetchin.io/api/v1/profile/skills/endorsers" \
--data-urlencode "profileUrlOrUrn=billcorbettauthor" \
--data-urlencode "skillUrn=urn:li:fsd_skill:(ACoAAAAteRwB-gns09UDa-RYj02ngoedsj7C9QM,25)" \
-H "X-API-Key: your-api-key-here"
const params = new URLSearchParams({
profileUrlOrUrn: 'billcorbettauthor',
skillUrn: 'urn:li:fsd_skill:(ACoAAAAteRwB-gns09UDa-RYj02ngoedsj7C9QM,25)'
});
const response = await fetch(
`https://api.fetchin.io/api/v1/profile/skills/endorsers?${params}`,
{ headers: { 'X-API-Key': 'your-api-key-here' } }
);
const data = await response.json();
console.log(data.endorsers);
import requests
response = requests.get(
'https://api.fetchin.io/api/v1/profile/skills/endorsers',
params={
'profileUrlOrUrn': 'billcorbettauthor',
'skillUrn': 'urn:li:fsd_skill:(ACoAAAAteRwB-gns09UDa-RYj02ngoedsj7C9QM,25)',
},
headers={'X-API-Key': 'your-api-key-here'},
)
data = response.json()
print(data['endorsers'])
Example Response
{
"endorsers": [
{
"publicIdentifier": "jane-doe",
"url": "https://www.linkedin.com/in/jane-doe/",
"name": "Jane Doe",
"headline": "VP Engineering at Example Corp",
"profilePictureUrl": "https://media.licdn.com/dms/image/v2/.../profile-displayphoto-shrink_800_800/...",
"profilePictureUrls": [
{ "url": "https://media.licdn.com/dms/image/v2/.../profile-displayphoto-shrink_100_100/...", "width": 100, "height": 100 },
{ "url": "https://media.licdn.com/dms/image/v2/.../profile-displayphoto-shrink_800_800/...", "width": 800, "height": 800 }
]
},
{
"publicIdentifier": "john-smith-4b2a",
"url": "https://www.linkedin.com/in/john-smith-4b2a/",
"name": "John Smith",
"headline": "Founder at Example Labs"
}
],
"hasMore": true,
"nextStart": 100
}
Errors
See Error Handling for the full list of error codes and recommended handling.400—MISSING_PARAMETER/INVALID_PARAMETER/INVALID_URN401—INVALID_API_KEY402—QUOTA_EXHAUSTED404—PROFILE_NOT_FOUND429—RATE_LIMITED500—INTERNAL_ERROR503—SERVICE_UNAVAILABLE. The page could not be fetched on this call: retry. A failed page is never returned as an empty list.
Pagination
The list is paged by offset, up to 100 endorsers per page.- Request the first page with
start=0(or omitstart). - If
hasMoreistrue, request the next page with thenextStartthe response gave you. - Continue until
hasMoreisfalse.
async function fetchAllEndorsers(profile, skillUrn) {
const endorsers = [];
let start = 0;
let hasMore = true;
while (hasMore) {
const params = new URLSearchParams({
profileUrlOrUrn: profile,
skillUrn,
start: String(start)
});
const response = await fetch(
`https://api.fetchin.io/api/v1/profile/skills/endorsers?${params}`,
{ headers: { 'X-API-Key': 'your-api-key-here' } }
);
const data = await response.json();
endorsers.push(...data.endorsers);
hasMore = data.hasMore;
start = data.nextStart ?? start;
}
return endorsers;
}
Notes
count. A skill with 250 endorsers takes three calls. Errors are free — with one exception: a 404 not found costs 1 credit. See Quotas.Authorizations
Query Parameters
The professional profile. Accepts a profile URN (example urn:li:fsd_profile:ACoAAAAteRwB-gns09UDa-RYj02ngoedsj7C9QM), a public identifier/slug (example billcorbettauthor), or a full profile URL (example https://www.linkedin.com/in/billcorbettauthor; a trailing slash is ignored). Member profiles only: a company page URL or URN is rejected with a 400 error, free of charge.
"billcorbettauthor"
The skill, exactly as GET /api/v1/profile returns it in skills[].skillUrn. It must belong to profileUrlOrUrn. A value that is not a skill URN (a skill name, for instance), or a skill of another member when profileUrlOrUrn is a URN, returns 400 INVALID_PARAMETER at no cost, before anything is fetched.
"urn:li:fsd_skill:(ACoAAAAteRwB-gns09UDa-RYj02ngoedsj7C9QM,25)"
Number of entries per page (default: 100, the most a page holds). A value above 100 is clamped to 100, not rejected. A call costs the same whatever the count.
1 <= x <= 100Offset of the first entry to return. Pass 0 (or omit) for the first page, then the nextStart of the previous response. Keep paging while hasMore is true.
x >= 0Response
Successfully fetched the endorsers
The members who endorsed the skill, in the order the source lists them. Empty when nobody did, or when start is past the end of the list.
Show child attributes
Show child attributes
True when the source has more entries after this page, false on the last page.
The start value to request next. Present only when hasMore is true.
100